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

时间:2013-01-24 12:19:30

标签: java bit-shift

  

可能重复:
  Why is (-1 >>> 32) = -1?

无符号右移运算符在最左边插入0。所以当我做的时候

System.out.println(Integer.toBinaryString(-1>>>30))

输出

11

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

System.out.println(Integer.toBinaryString(-1>>>32))

输出

11111111111111111111111111111111

不应该是0吗?

1 个答案:

答案 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