hou*_*ker 5 javascript v8 javascriptcore
我对JS(ES6)中的"按位左操作符"的理解是,右边的空白用零填充.
然而,根据经验,我注意到在V8和JSC中,如果我们移动64或更多,设置位似乎突然重新出现.
(255 << 64).toString(2)
//-> "11111111"
Run Code Online (Sandbox Code Playgroud)
这与我的预期相反,即更大的变化将无限期地产生右边的零.
我没有立即在EcmaScript 2016页面中看到这种行为在<< - 我错过了什么,或者对于较大的班次可能是未定义的行为?
规范(第12.8.3.1节)规定了要移位的位数:
ShiftExpression:ShiftExpression << AdditiveExpression
- 让lref成为评估ShiftExpression的结果.
- 让lval成为
- 的GetValue(LREF).
- ReturnIfAbrupt(lval中).
- 让rref成为评估AdditiveExpression的结果.
- 设rval为GetValue(rref).
- ReturnIfAbrupt(RVAL).
- 让lnum成为ToInt32(lval).
- ReturnIfAbrupt(lnum缓冲区里).
- 让rnum成为ToUint32(rval).
- ReturnIfAbrupt(RNUM).
- 设shiftCount是屏蔽除rnum的最低有效5位之外的所有位的结果,即计算rnum和0x1F.
- 通过shiftCount位返回左移lnum的结果.结果是带符号的32位整数.
由于64和0x1F为0,因此意味着"无移位",这就是这些位"重新出现"的原因.
要移位的位数上限为31,即
function shiftLeft(number, numShift) {
return number << (numShift % 32); // equivalent code
}
Run Code Online (Sandbox Code Playgroud)