【问题标题】:Why is 3 >> 32 equal to 3? [duplicate]为什么 3 >> 32 等于 3? [复制]
【发布时间】:2019-05-29 08:41:53
【问题描述】:

为什么 3 右移 32 等于 3 而不是 0。

我在 nodeJs 和 Java 中得到了这些结果

  • 3 >> 31 = 0
  • 3 >> 32 = 3
  • 3 >> 33 = 1
  • 3 >> 34 = 0
  • 3 >> 35 = 0

【问题讨论】:

  • C++ 不是 NodeJs 和 Java。
  • 这是未定义的行为。
  • 没有移位值的运行时检查,大于 32 的移位取决于处理器行为。所以对于语言来说,这是未定义的行为。最有可能的是,指令字段中只有 5 位来指定移位,并且只保留移位值的 5 LSB。所以 >>32 等价于 >>0,>>33 等价于 >>1 等等。
  • 左移 n
  • 它看起来像一些循环移位:int32 的长度是 32。所以对于大于或等于 32 的 shif 会发生这样的事情:val >> (shift % 32)。对于 32,它将是 0 和 3 >> 0 = 3,对于 33,移位将是 33 % 32 = 1 -> 3 >> 1 = 1。

标签: java node.js bitwise-operators bit-shift


【解决方案1】:

这是 Java 语言规范的一部分。右手操作数被包裹,因此它总是在 0 - bits 的范围内,其中 bits 是左手操作数的位数。由于您要移动一个 32 位整数,因此右手操作数被包裹在 0 到 31 之间。32 变为 0,33 变为 1,依此类推。

Java language specification for shift operators

如果左侧操作数的提升类型是 int,则只有右侧操作数的五个最低位用作移位距离。就好像右手操作数受到按位逻辑与运算符 & (§15.22.1) 的影响,掩码值为 0x1f (0b11111)。因此,实际使用的移位距离始终在 0 到 31 的范围内,包括 0 到 31。

【讨论】:

    猜你喜欢
    • 2015-04-08
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 2015-07-26
    • 2011-04-24
    • 2018-09-29
    • 1970-01-01
    相关资源
    最近更新 更多