糟糕的转移导致java

时间:2016-07-22 04:56:59

标签: java bit-shift

我正在尝试执行逻辑右移和左移(使用>>>和<<)。不幸的是,我发现,当移位量大于32时,它会以模数旋转位,而不是将位移到正确的位置。它实际上并没有改变它们。我怎么能避免呢?在centOS中使用java 7。 的更新 在玩了一些例子后我觉得有一个错误:

public static void main(String[] args) {
    int a = 0xc0000003;
    int b = a >>> 32;
    int c = 0xc0000003;
    int d = c << 36;
    System.out.println("b=" + b + ", d=" + d);  
}

输出为b=-1073741821, d=48。为什么?如何在c?中左右移动逻辑?

1 个答案:

答案 0 :(得分:0)

在java中,右手值没有完全转换,但这就是答案:

  

如果左侧操作数的提升类型是int,那么只有   右手操作数的五个最低位用作移位   距离。好像右手操作数受到了a   按位逻辑AND运算符&amp; (§15.22.1),掩码值为0x1f   (0b11111)。因此实际使用的换档距离总是在   范围0到31,包括在内。

     

如果左侧操作数的提升类型很长,那么只有   右手操作数的六个最低位用作移位   距离。好像右手操作数受到了a   按位逻辑AND运算符&amp; (§15.22.1),掩码值为0x3f   (0b111111)。因此实际使用的换档距离总是在   范围0到63,包括在内。

取自The Java® Language Specification。对我来说,这种行为不是很直观......