我正在尝试执行逻辑右移和左移(使用>>>和<<)。不幸的是,我发现,当移位量大于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?中左右移动逻辑?
答案 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。对我来说,这种行为不是很直观......