unsigned right Shift'>>>'Java中的运算符

Sas*_*wat 34 java bit-shift

可能重复:
为什么(-1 >>> 32)= -1?

无符号右移运算符在最左边插入0.所以,当我这样做

System.out.println(Integer.toBinaryString(-1>>>30))
Run Code Online (Sandbox Code Playgroud)

产量

11
Run Code Online (Sandbox Code Playgroud)

因此,它在最左边的位中插入0.

System.out.println(Integer.toBinaryString(-1>>>32))
Run Code Online (Sandbox Code Playgroud)

产量

11111111111111111111111111111111
Run Code Online (Sandbox Code Playgroud)

不应该是0吗?

Evg*_*eev 49

见http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.19

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

这-1 >>> 32 相当于-1 >>> 0并且-1 >>> 33 等同于-1 >>> 1 ,尤其令人困惑,-1 >>> -1 相当于-1 >>> 31