【问题标题】:Why does `number |= 0` convert to 32bit integer? [duplicate]为什么 `number |= 0` 会转换为 32 位整数? [复制]
【发布时间】:2019-06-21 18:00:31
【问题描述】:

Here我找到了如下一段代码:

hash = hash | 0; // Convert to 32bit integer

谁能解释为什么这段代码将hash 转换为 32 位整数?

【问题讨论】:

  • 请注意,>>> 0 更常见:它通过转换为 无符号 32 位整数来确保结果为正数。

标签: javascript


【解决方案1】:

这是因为| 是位运算符。所以

hash = hash | 0;

执行按位 or 操作,即按位 or 的哈希和零。

您也会观察到其他位运算符的类似行为,例如:

var x = 4;

console.log(4 >> 1); // right shift bitwise operator

感谢@Keith 提到“JS 中的 Bitwize 操作,只有 32 位有符号整数。”在评论中。

【讨论】:

  • 谢谢,我知道了,假设我们有 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 和零,其中所有位都是0。如果我们这样做 |我们将得到 5 个字节。
  • @Jim2018 JS中的Bitwize操作,只有32bit signed int。
  • @Keith 如果这是真的,那么这是关键点,应该添加到答案中。
  • @Jim2018 是的,我确实认为答案会从中受益。如果他也愿意,我会把这个留给 amrender 更新他的答案。
  • @Keith 感谢您提供更多信息。请随时更新我的​​答案,谢谢
【解决方案2】:

原因是按位运算符在应用运算符之前将其参数隐式转换为 32 位整数。除此之外,| 00 执行按位或,这本质上是一个空操作。

在 ES6 规范中,| 运算符是 defined as a binary operator in 12.11,然后是 runtime semantics are defined in 12.11.3

特别是,步骤 7 和 9 将参数转换为 32 位整数,步骤 11 将结果作为 32 位整数返回:

产生式AA@B,其中@是位运算符之一 上面的产品,评估如下:

  1. lref 为评估 A 的结果。
  2. lvalGetValue(lref)。
  3. ReturnIfAbrupt(lval)。
  4. rref 为评估 B 的结果。
  5. rvalGetValue(rref)。
  6. ReturnIfAbrupt(rval).
  7. lnumToInt32(lval)。
  8. ReturnIfAbrupt(lnum).
  9. rnumToInt32(rval)。
  10. ReturnIfAbrupt(rnum).
  11. 返回将按位运算符@ 应用于lnumrnum 的结果。 结果是一个有符号的 32 位整数。

[强调添加]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-30
    • 2017-08-18
    • 2015-05-18
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 2016-05-07
    相关资源
    最近更新 更多