我对负数的右移操作很困惑,这里是代码。
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
s)。
(来自维基百科的图片)
顺便说一下,算术左移和逻辑左移的结果是一样的,所以只有一个左移<<
.
关于Java:负数右移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15457893/