作者:拍友2502908871 | 来源:互联网 | 2022-12-06 20:21
我对JS(ES6)中的"按位左操作符"的理解是,右边的空白用零填充.
然而,根据经验,我注意到在V8和JSC中,如果我们移动64或更多,设置位似乎突然重新出现.
(255 <<64).toString(2)
//-> "11111111"
这与我的预期相反,即更大的变化将无限期地产生右边的零.
我没有立即在EcmaScript 2016页面中看到这种行为在<<- 我错过了什么,或者对于较大的班次可能是未定义的行为?
1> Derek 朕會功夫..:
规范(第12.8.3.1节)规定了要移位的位数:
ShiftExpression:ShiftExpression <
让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,因此意味着"无移位",这就是这些位"重新出现"的原因.
TL;博士
要移位的位数上限为31,即
function shiftLeft(number, numShift) {
return number <<(numShift % 32); // equivalent code
}