为什么在Java中,将16右移32得到16而不是0?16>&燃气轮机;32=16为什么?
在java中使用右移运算符时,我遇到了一个看起来很奇怪的情况。当我右移16乘31时,结果是0,但是尝试右移16乘32时,它本身仍然是16。有人能解释一下吗?我快疯了为什么在Java中,将16右移32得到16而不是0?16>&燃气轮机;32=16为什么?,java,Java,在java中使用右移运算符时,我遇到了一个看起来很奇怪的情况。当我右移16乘31时,结果是0,但是尝试右移16乘32时,它本身仍然是16。有人能解释一下吗?我快疯了 public class RightShiftTest { public static void main(String args[]) { int b = 16; System.out.println("Bit pattern for int " + b + " is "
public class RightShiftTest {
public static void main(String args[]) {
int b = 16;
System.out.println("Bit pattern for int " + b + " is " +Integer.toBinaryString(b));
// As expected it is 0
System.out.println("After right-shifting " + b + " for 31 times the value is " + (b>>31) + " and bit pattern is " +Integer.toBinaryString(b>>31));
// But why is it not 0 but 16
System.out.println("After right-shifting " + b + " for 32 times the value is " + (b>>32) + " and bit pattern is " +Integer.toBinaryString(b>>32));
}
}
Output:
Bit pattern for int 16 is 10000
After right-shifting 16 for 31 times the value is 0 and bit pattern is 0
After right-shifting 16 for 32 times the value is 16 and bit pattern is 10000
美国
如果左侧操作数的提升类型为int
,则只有五个
右操作数的最低阶位用作移位
距离。就好像右侧操作数受到
位逻辑与运算符和(§15.22.1),掩码值0x1f
(0b11111
)。因此,实际使用的换档距离始终处于
范围从0到31,包括在内。
值32表示为
100000
最低的5位是00000
所以0
,移动了0位。简单的谷歌搜索可以给你答案。问:“为什么语言X会像它那样做呢?”答:因为规范这么说。常识来了,所以我不想检查规范,它说:(16>>1)32次会得到与(16>>32)相同的结果就一次,这是个合理的问题。事实上,我认为这是一个很好的问题,也是非常有用的问答参考资料。在任何情况下,这都不是一个问题的复制品,这个问题只是问轮班操作员如何工作,而对相关问题的回答中没有一个能解释这种行为。然而,这里给出的答案很好地解释了这一点。回答很好!非常感谢。如果你的问题已经得到了回答,请不要发表评论来感谢回答者。一旦你有了至少15个代表,你也可以接受的答案和任何其他你认为有用的答案。