负逻辑转变

时间:2010-04-20 00:08:00

标签: java bit-manipulation bit-shift

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

不是>>> -1与<<相同1?但是-32<< 1 = -64。
我已经阅读了两个补充,但仍然不理解推理。

2 个答案:

答案 0 :(得分:6)

这是因为当您移动32位int时,它只需要移位距离的最后5位。 (即mod 32),所以-1 mod 32 = 31,所以你向右移31位。当您移动一个负数(其开始位均为1)时,最终会得到1.同样,向右移动-2会向右移动30位等。如果您移动long ,它需要6位的移位距离。请参阅此处了解班次操作员的工作原理: http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.19

答案 1 :(得分:1)

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

对于32位int i

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

对于64位long num

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

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

另见