负逻辑转变

在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位的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

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

对于32位int i

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

对于64位long num

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

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

也可以看看

  • JLS 15.9移位运算符
    • “如果左侧操作数的提升类型是intlong ),则只使用右侧操作数的五(六)个最低位作为移位距离。”
  • Java Puzzlers :Puzzle 27:Shifty i 's
  • 像C#/ Java这样的高级语言掩盖位移计数操作数的原因是什么?