“运营商做什么比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

这意味着第二个操作数不能大于310x1F )。 如果是这样,在继续之前通过位掩码减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