【问题标题】:Difference between >>> and >> operators [duplicate]>>> 和 >> 运算符之间的区别 [重复]
【发布时间】:2010-12-30 15:37:03
【问题描述】:

如果移位的数字是正数 >>> 和 >> 工作相同。

如果移位的数字是负数 >>> 用 1 填充最高有效位,而 >> 操作移位用 0 填充 MSB。

我的理解正确吗?

如果负数存储时 MSB 设置为 1,而不是 Java 使用的 2s 补码方式,则运算符的行为将完全不同,对吗?

【问题讨论】:

标签: java bit-shift


【解决方案1】:

正好相反,如果 h.o 位为 1,则 >>> 用零填充,而 >> 用 1 填充。

【讨论】:

  • 你能解释为什么7>>>32=7。我听说过循环班次,但我认为这只适用于>>7>>>32 在 32 个班次之后不会等于零吗?
  • @IanLimarta:如果左侧是 int,则移位量减少 mod 32。在您的情况下,这意味着移位量为 0,这实际上是一个空操作。见the JLS
【解决方案2】:

Definition of the >>> operator in the Java Language Specification:

n>>>s 的值是 n 个右移 s 位位置,扩展为零。如果 n 为正,则结果与n>>s 相同;如果 n 为负数,如果左侧操作数的类型为 int,则结果等于表达式 (n>>s)+(2<<~s) 的结果;如果左侧操作数的类型为 (n>>s)+(2L<<~s),则结果等于表达式 (n>>s)+(2<<~s) 的结果操作数是long

【讨论】:

    【解决方案3】:

    表示负数的方式称为 2 的补码。为了演示这是如何工作的,以 -12 为例。 12,在二进制中,是 00001100(假设整数是 8 位,但实际上它们要大得多)。通过简单地反转每一位来取 2 的补码,得到 11110011。然后,只需加 1 即可得到 11110100。请注意,如果再次应用相同的步骤,则会得到正数 12。

    >>> 无论如何都会移到零,所以 12 >>> 1 应该给你 00000110,即 6,而 (-12) >>> 1 应该给你 01111010,即 122。如果你真的在 Java 中试试这个,你会得到一个更大的数字,因为 Java 整数实际上远大于 8 位。

    >> 移动位与最高位相同,因此正数保持正数,负数保持负数。 12 >> 1 是 00000110(仍然是 6), (-12) >> 1 是 11111010,即负 6。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2013-05-16
      • 2014-03-28
      • 2021-12-18
      • 2017-12-25
      • 2015-12-09
      相关资源
      最近更新 更多