负逻辑转变
在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移位运算符
- “如果左侧操作数的提升类型是
int
(long
),则只使用右侧操作数的五(六)个最低位作为移位距离。”
- “如果左侧操作数的提升类型是
- Java Puzzlers :Puzzle 27:Shifty
i
's - 像C#/ Java这样的高级语言掩盖位移计数操作数的原因是什么?