我对JS(ES6)中的<<按位左运算符的理解是,右边的空白用零填充。
但是,根据经验,我注意到在V8和JSC中,如果我们移位64或更多,设置的比特似乎会突然出现。
(255 << 64).toString(2)
//-> "11111111"
这与我的预期相反,因为较大的偏移会无限期地在右侧无限地产生零。
在EcmaScript 2016页面的<<上,我没有立即看到这种行为–是我遗漏了什么,还是对于较大的班次可能未定义这种行为?
答案 0 :(得分:7)
规范(Section 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
}