为什么是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。