为什么1>> 32 == 1?

时间:2010-07-03 05:24:51

标签: java bit-manipulation

我想知道这可能是一个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的倍数,我也得到相同的结果。

我是否需要编写自己的右移来检查这个?

2 个答案:

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