2

在Java中,为什么 -32 >>> -1 = 1 ?
它不仅限于-32。只要它们不是太大,它就适用于所有负数。
我发现
x >>> -1 = 1
x >>> -2 = 3
x >>> -3 = 7
x >>> -4 = 15
给定 0 > x > 一些大的负数

>>> -1 和 << 1 不一样吗?但是-32 << 1 = -64。
我已经阅读了二的补码,但仍然不明白其中的原因。

4

2 回答 2

6

这是因为当您移动 32-bitint时,它只需要移动距离的最后 5 位。(即 mod 32),所以 -1 mod 32 = 31,所以你右移 31 位。当你移动一个负数(它的开始位都是 1)时,你会得到一个 1。类似地,右移 -2 就是右移 30 位,等等。如果你移动 a long,它需要 6位移距离的位。有关移位运算符如何工作的规范,请参见此处:http: //docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.19

于 2010-04-20T00:12:09.603 回答
1

Java 根据左操作数的大小屏蔽右操作数。

对于 32 位int i,

i << N   --> i << (N mod 32)

对于 64 位long num,

num << N --> num << (N mod 64)

移位计数操作数的这种屏蔽也适用于>>>>>

也可以看看

于 2010-04-20T00:51:51.930 回答