为什么是1 >> 32 == 1?

我想知道如果这可能是一个JVM的错误?

Java版本“1.6.0_0”OpenJDK运行时环境(IcedTea6 1.4.1)(6b14-1.4.1-0ubuntu13)OpenJDK 64位服务器虚拟机(构build14.0-b08,混合模式)

class Tmp { public static void main(String[] args) { System.out.println("1>>1 = "+(1>>1)); System.out.println("1>>2 = "+(1>>2)); System.out.println("1>>31 = "+(1>>31)); System.out.println("1>>32 = "+(1>>32)); System.out.println("1>>33 = "+(1>>33)); } } 

当我运行它时产生这个:

 1>>1 = 0 1>>2 = 0 1>>31 = 0 1>>32 = 1 <---------- should be 0 i think 1>>33 = 0 

我也得到32的任何倍数相同的结果。

我需要写我自己的右移来检查这个吗?

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

15.19移位操作符

如果左侧操作数的升级types是int ,则只有右侧操作数的五个最低位用作移位距离。 就好像右边的操作数受 掩码值为0x1f 的按位逻辑AND运算符 &(第15.22.1节)。 实际使用的换档距离总是在0到31的范围内。

如果左侧操作数的升级types很 ,那么只有右侧操作数的最低六位用作移位距离 。 就好像右边的操作数是经过按位逻辑的AND运算符(§15.22.1), 屏蔽值为0x3f 。 实际使用的换档距离总是在0到63的范围内。

(重点是我的)

这不是一个错误。 在n >> m ,它只查看n >> m的最后五位,所以大于31的任何数字都会减less到数字mod 32.所以, (256 >> 37) == 8是真的。

编辑:这是真的,如果你正在使用整数。 如果它很长,那么它会查看m的最后六位 ,或mod 64。