可能重复:
为什么 (-1 >>> 32) = -1?
无符号右移运算符在最左边插入一个 0。所以当我这样做的时候
System.out.println(Integer.toBinaryString(-1>>>30))
输出
11
因此,它在最左边的位中插入 0。
System.out.println(Integer.toBinaryString(-1>>>32))
输出
11111111111111111111111111111111
不应该是0吗?
可能重复:
为什么 (-1 >>> 32) = -1?
无符号右移运算符在最左边插入一个 0。所以当我这样做的时候
System.out.println(Integer.toBinaryString(-1>>>30))
11
因此,它在最左边的位中插入 0。
System.out.println(Integer.toBinaryString(-1>>>32))
11111111111111111111111111111111
不应该是0吗?
请参阅http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.19
如果左侧操作数的提升类型是 int,则只有右侧操作数的五个最低位用作移位距离。就好像右手操作数受到按位逻辑与运算符 & (§15.22.1) 的影响,掩码值为 0x1f (0b11111)。因此,实际使用的移位距离始终在 0 到 31 的范围内,包括 0 到 31。
that is-1 >>> 32
等价于-1 >>> 0
and-1 >>> 33
等价于-1 >>> 1
and 尤其令人困惑的-1 >>> -1
是 等价于-1 >>> 31