java位操作>>>移位

ses*_*ses 8 java int bits operation

为什么如果

int x = -1 // binary: 11111111111111111111111111111111
x = x >>> 31; 
Run Code Online (Sandbox Code Playgroud)

我们有00000000000000000000000000000001

但如果

int x = -1
x = x >>> 32;
Run Code Online (Sandbox Code Playgroud)

我们有11111111111111111111111111111111(再次-1)

但不是00000000000000000000000000000000?

Roh*_*ain 13

来自JLS的第15.19节:

如果左侧操作数的提升类型是int,则只使用右侧操作数的五个最低位作为移位距离.就好像右手操作数受到&带掩码值的按位逻辑AND运算符(第15.22.1节)的影响0x1f (0b11111).因此,实际使用的移位距离始终在包括范围内0 to 31.

强调我的.所以:

x >>> n
Run Code Online (Sandbox Code Playgroud)

相当于:

x >>> n & 0x1f  // or x >>> n % 32
Run Code Online (Sandbox Code Playgroud)

所以,x >>> 32相当于x >>> 32 & 0x1f<==> x >>> 0== x.

因此,经验法则是,无论何时将数字移动32(int是32 bits)的倍数,您都会得到相同的值.

  • 这由[JLS 15.19](http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.19)指定.但推理可能是人们期望转变为快速运行,这是几乎每个处理器上唯一可以无分支的实现. (4认同)