【问题标题】:Negative logical shift负逻辑移位
【发布时间】:2011-02-09 22:22:50
【问题描述】:

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

>>> -1 和 我已经阅读了二的补码,但仍然不明白其中的原因。

【问题讨论】:

标签: java bit-manipulation bit-shift


【解决方案1】:

这是因为当您移动 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

【讨论】:

  • 至于为什么,大概是因为不同的处理器有不同的规则。例如,IIRC ARM 将采用底部(无符号)字节作为移位大小。此规则使其在任何合理的处理器(和 ARM)上都相当有效。
  • 我现在明白了。我以前读过 Java int 在 32 个位置的倍数上移动(x
【解决方案2】:

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

对于 32 位 int i

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

对于 64 位 long num

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

移位计数操作数的这种屏蔽也适用于&gt;&gt;&gt;&gt;&gt;

另见

【讨论】:

    猜你喜欢
    • 2011-04-11
    • 2023-01-09
    • 2014-12-04
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多