可能重复:
Why is (-1 >>> 32) = -1?
无符号右移运算符在最左边插入0。所以当我做的时候
System.out.println(Integer.toBinaryString(-1>>>30))
11
因此,它在最左边的位插入0。
System.out.println(Integer.toBinaryString(-1>>>32))
11111111111111111111111111111111
不应该是0吗?
答案 0 :(得分:47)
请参阅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