“运营商做什么比32更远?
在节点环境| javascript代码:
1 << 33 === 1 << 1 // true
我知道数字存储在32位。 它在
0000 0000 0000 0000 0000 0000 0000 0001
之后:“33
1 0000 0000 0000 0000 0000 0000 0000 000?
和:
1<< 35 === 1 << 3
问题: <<
操作符在这里如何工作?
1)“运营商如何工作?
您可以在规范 (ECMA 262)中find<<
的定义。
您的问题的关键一步是:
11)设shiftCount是屏蔽除rnum的最低有效5位之外的所有结果,即计算rnum
& 0x1F
。
这意味着第二个操作数不能大于31
( 0x1F
)。 如果是这样,在继续之前通过位掩码减less:
(33 & 0x1f) === 1 // true
所以:
1 << 33 // becomes... 1 << (33 & 0x1f) // becomes... 1 << 1
2)内存中的数字如何存储?
JavaScript中的一个数字是:
原始值对应于IEEE 754-2008的双精度64位二进制值
根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators :
右边的操作数应该小于32,但是如果不是只有低5位将被使用。
所以当b大于或等于32时, a<<(b&31)
意味着a<<(b&31)
。
当你使用<<
,转换几乎是循环的。 换句话说,当你移动32位时,你会得到相同的数字。 要么
1 << x
永远是平等的
1 << x % 32 (% is the mod)
因此, 1 << 33 === 1 << 1
总是为true
因为33 % 32 == 1
。