在Java中,为什么 -32 >>> -1 = 1 ?
它不仅限于-32。只要它们不是太大,它就适用于所有负数。
我发现
x >>> -1 = 1
x >>> -2 = 3
x >>> -3 = 7
x >>> -4 = 15
给定 0 > x > 一些大的负数
>>> -1 和 << 1 不一样吗?但是-32 << 1 = -64。
我已经阅读了二的补码,但仍然不明白其中的原因。
在Java中,为什么 -32 >>> -1 = 1 ?
它不仅限于-32。只要它们不是太大,它就适用于所有负数。
我发现
x >>> -1 = 1
x >>> -2 = 3
x >>> -3 = 7
x >>> -4 = 15
给定 0 > x > 一些大的负数
>>> -1 和 << 1 不一样吗?但是-32 << 1 = -64。
我已经阅读了二的补码,但仍然不明白其中的原因。
这是因为当您移动 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
Java 根据左操作数的大小屏蔽右操作数。
对于 32 位int i
,
i << N --> i << (N mod 32)
对于 64 位long num
,
num << N --> num << (N mod 64)
移位计数操作数的这种屏蔽也适用于>>
和>>>
。
int
( long
),则只有右侧操作数的五(六)个最低位用作移位距离。”i
的