JavaScript ES6(<<)中的按位左移是否超过63的移位?
作者:互联网
我对<<<<<< JS(ES6)中的按位左操作符是右边的空格用零填充. 然而,根据经验,我注意到在V8和JSC中,如果我们移动64或更多,设置位似乎突然重新出现.
(255 << 64).toString(2)
//-> "11111111"
这与我的预期相反,即更大的变化将无限期地产生右边的零.
我没有立即在<<<<<<<<<<<< - 我错过了什么,或者对于更大的转变,行为可能是不确定的?
解决方法:
规范(Section 12.8.3.1)规定了要移位的位数:
ShiftExpression : ShiftExpression << AdditiveExpression
- Let lref be the result of evaluating ShiftExpression.
- Let lval be
- GetValue(lref).
- ReturnIfAbrupt(lval).
- Let rref be the result of evaluating AdditiveExpression.
- Let rval be GetValue(rref).
- ReturnIfAbrupt(rval).
- Let lnum be ToInt32(lval).
- ReturnIfAbrupt(lnum).
- Let rnum be ToUint32(rval).
- ReturnIfAbrupt(rnum).
- Let shiftCount be the result of masking out all but the least significant 5 bits of rnum, that is, compute rnum & 0x1F.
- 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