编程语言
首页 > 编程语言> > JavaScript ES6(<<)中的按位左移是否超过63的移位?

JavaScript ES6(<<)中的按位左移是否超过63的移位?

作者:互联网

我对<<<<<< JS(ES6)中的按位左操作符是右边的空格用零填充. 然而,根据经验,我注意到在V8和JSC中,如果我们移动64或更多,设置位似乎突然重新出现.

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

这与我的预期相反,即更大的变化将无限期地产生右边的零.

我没有立即在<<<<<<<<<<<< - 我错过了什么,或者对于更大的转变,行为可能是不确定的?

解决方法:

规范(Section 12.8.3.1)规定了要移位的位数:

ShiftExpression : ShiftExpression << AdditiveExpression

  1. Let lref be the result of evaluating ShiftExpression.
  2. Let lval be
  3. GetValue(lref).
  4. ReturnIfAbrupt(lval).
  5. Let rref be the result of evaluating AdditiveExpression.
  6. Let rval be GetValue(rref).
  7. ReturnIfAbrupt(rval).
  8. Let lnum be ToInt32(lval).
  9. ReturnIfAbrupt(lnum).
  10. Let rnum be ToUint32(rval).
  11. ReturnIfAbrupt(rnum).
  12. Let shiftCount be the result of masking out all but the least significant 5 bits of rnum, that is, compute rnum & 0x1F.
  13. Return the result of left shifting lnum by shiftCount bits. The result is a signed 32-bit integer.

自64& 0x1F为0,表示“无移位”,这就是这些位“重新出现”的原因.

TL;博士

移位的位数上限为31,即

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

标签:javascript,v8,javascriptcore
来源: https://codeday.me/bug/20190527/1161859.html