我对负数的右移操作非常困惑,这是代码。
int n = -15;
System.out.println(Integer.toBinaryString(n));
int mask = n >> 31;
System.out.println(Integer.toBinaryString(mask));
结果是:
11111111111111111111111111110001
11111111111111111111111111111111
为什么将负数右移31而不是1(符号位)?
最佳答案
因为在Java中没有无符号数据类型,所以有两种右移类型:arithmetic shift >>
和logical shift >>>
。 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html
算术移位>>
将保留符号位。
无符号移位>>>
将不保留符号位(从而填充0
)。
(图片来自维基百科)
顺便说一下,算术左移和逻辑左移都具有相同的结果,因此只有一个左移<<
。
关于java - Java:负数右移,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15457893/