JavaScript ES6 (<<) 中的按位左移是否在 63 以上是周期性的?



我对 JS (ES6( 中<<位左运算符的理解是右边的空白用零填充。

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

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

这与我的预期相反,即更大的偏移将无限期地只产生正确的零。

我没有立即在 EcmaScript 2016 页面上看到这种行为的定义 <<– 我是否遗漏了什么,或者对于较大的转变,该行为可能未定义?

规范(第 12.8.3.1 节(指定要移位的位数是屏蔽的:

ShiftExpression

: ShiftExpression <<AdditiveExpression

  1. 让 lref 成为评估 ShiftExpression 的结果。
  2. 让 lval 成为
  3. GetValue(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成为屏蔽除最低有效5位之外的所有rnum的结果,即计算rnum & 0x1F。
  13. 返回左移 lnum 按 shiftCount 位的结果。结果是一个有符号的 32 位整数。

由于 64 & 0x1F 是 0,这意味着"不移位",这就是位"重新出现"的原因。

tl;博士

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

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

相关内容

最新更新