虽然我不是 Python 程序员,但我通常会这样解决这个问题:
x = (x>>1)|(x&80)
x = (x>>1)|(x&8000)
x = (x>>1)|(x&80000000)
所以只需将原始x
的最高有效位复制到位移创建的空间中。 但是,这仅适用于1位的位移。 对于更多位移,您需要执行以下操作:
if (x<0) x = (x>>2)|0xC0; else x = x>>2; // 8bit
if (x<0) x = (x>>2)|0xC000; else x = x>>2; // 16bit
if (x<0) x = (x>>2)|0xC0000000; else x = x>>2; // 32bit
if (x<0) x = (x>>3)|0xE0; else x = x>>3; // 8bit
if (x<0) x = (x>>3)|0xE000; else x = x>>3; // 16bit
if (x<0) x = (x>>3)|0xE0000000; else x = x>>3; // 32bit
if (x<0) x = (x>>4)|0xF0; else x = x>>4; // 8bit
if (x<0) x = (x>>4)|0xF000; else x = x>>4; // 16bit
if (x<0) x = (x>>4)|0xF0000000; else x = x>>4; // 32bit
if (x<0) x = (x>>5)|0xF8; else x = x>>5; // 8bit
if (x<0) x = (x>>5)|0xF800; else x = x>>5; // 16bit
if (x<0) x = (x>>5)|0xF8000000; else x = x>>5; // 32bit
...
你可以为掩码创建一个查找表(LUT)
LUT8[8]=
{
0x00,
0x80,
0xC0,
0xE0,
0xF0,
0xF8,
0xFC,
0xFE,
}
if (x<0) x = (x>>k)|LUT8[k&7]; else x = x>>k; // 8bit
按位移动 k
位的掩码只是一个二进制数,从最高有效位开始它包含 k
个 1,其余位为 0。
还有一种更简单的解决方案(代价是两次否定),如下:
if (x<0) x = -((-x)>>k); else x = x>>k;
>>
和>>>
搞反了:Java(和Javascript)支持两种类型的右移位运算符。>>
运算符是有符号右移位运算符,而>>>
则是无符号右移位运算符。 - chqrlie