【问题标题】:Are bitwise left shifts in JavaScript ES6 (<<) cyclical above a shift of 63?JavaScript ES6 (<<) 中的按位左移是否在 63 移位以上循环?
【发布时间】:2018-08-22 21:10:06
【问题描述】:

我对

然而,根据经验,我注意到在 V8 和 JSC 中,如果我们移动 64 位或更多,设置的位似乎会突然重新出现。

(255 << 64).toString(2)
//-> "11111111" 

这与我的预期相反,即较大的移位将无限期地在右侧仅产生零。

我没有立即在

【问题讨论】:

  • 如果规格(根据下面的答案)不是你的一杯茶,总是有 documentation 说明 The right operand should be less than 32, but if not only the low five bits will be used. - 即在你的情况下,低五位是 00000 。 .. 所以,如果你左移 65 则与左移 1 相同
  • Shift 32 得到相同的结果。

标签: javascript v8 javascriptcore


【解决方案1】:

规范 (Section 12.8.3.1) 指定要移位的位数被屏蔽:

ShiftExpression : ShiftExpression

  1. 设 lref 为计算 ShiftExpression 的结果。
  2. 让 lval 成为
  3. 获取值(lref)。
  4. ReturnIfAbrupt(lval)。
  5. 设 rref 为 AdditiveExpression 的计算结果。
  6. 令 rval 为 GetValue(rref)。
  7. ReturnIfAbrupt(rval)。
  8. 令 lnum 为 ToInt32(lval)。
  9. ReturnIfAbrupt(lnum)。
  10. 设 rnum 为 ToUint32(rval)。
  11. ReturnIfAbrupt(rnum)。
  12. 令 shiftCount 为屏蔽掉除 rnum 的最低有效 5 位以外的所有结果,即计算 rnum & 0x1F。
  13. 返回将 lnum 左移 shiftCount 位的结果。结果是一个带符号的 32 位整数。

由于 64 & 0x1F 为 0,这意味着“没有移位”,这就是位“重新出现”的原因。

tl;博士

要移位的位数上限为 31,即

function shiftLeft(number, numShift) {
    return number << (numShift % 32);  // equivalent code
}

【讨论】:

  • 规格很好,但阅读时会受到惩罚 - documentation 技术含量较低,但传达了相同的信息:p
  • 知道了——谢谢! (我现在在文档中看到“正确的操作数应该小于 32,但如果不只使用低五位。”)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2012-08-07
  • 1970-01-01
相关资源
最近更新 更多