我想知道这可能是一个JVM错误吗?
java版“1.6.0_0” OpenJDK运行时环境(IcedTea6 1.4.1)(6b14-1.4.1-0ubuntu13) OpenJDK 64位服务器VM(内置14.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的倍数,我也得到相同的结果。
我是否需要编写自己的右移来检查这个?
答案 0 :(得分:31)
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.22.1
15.19班次运营商
如果左侧操作数的提升类型为 int ,则仅使用右侧操作数的五个最低位作为换班车。就好像右手操作数受到按位逻辑AND运算符&amp; (§15.22.1),掩码值为0x1f 。因此,实际使用的移动距离始终在0到31的范围内,包括0和31。
如果左侧操作数的提升类型为 long ,则仅使用右侧操作数的六个最低位作为换档距离。就好像右手操作数受到按位逻辑AND运算符&amp; (§15.22.1),掩码值0x3f 。因此,实际使用的移位距离始终在0到63之间,包括0和63.
(强调我的)
答案 1 :(得分:17)
这不是一个错误。在n >> m
中,它仅查看m的最后五位 - 因此任何大于31的数字都将减少到该数字mod 32.因此,(256 >> 37) == 8
为真。
编辑:如果你正在使用整数,这是真的。如果它很长,那么它会查看m的最后六个位,或64位的mod。