在节点环境中| javascript代码:
1 << 33 === 1 << 1
// true
我知道Number以32位存储。它在
0000 0000 0000 0000 0000 0000 0000 0001
之后:&lt;&lt; 33
1 0000 0000 0000 0000 0000 0000 0000 000?
和
1<< 35 === 1 << 3
问题:<<
运营商如何在这里工作?
答案 0 :(得分:5)
1)&lt;&lt;运营商如何工作?
您可以找到<<
within the specification(ECMA 262)的定义。
您问题的关键步骤是:
11)让 shiftCount 成为屏蔽rnum除了最低5位之外的所有位的结果,即计算rnum
& 0x1F
。
这意味着第二个操作数不能大于31
(0x1F
)。如果是,则在继续之前通过位掩码减少:
(33 & 0x1f) === 1 // true
所以:
1 << 33 // becomes...
1 << (33 & 0x1f) // becomes...
1 << 1
2)如何存储内存中的数字?
原始值对应于双精度64位二进制格式IEEE 754-2008值
答案 1 :(得分:4)
根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators:
右操作数应小于32,但如果不是,则仅使用低5位。
当b大于或等于32时,a<<b
表示a<<(b&31)
。
答案 2 :(得分:1)
当您使用<<
时,转移几乎循环。换句话说,当你移动32位时,你会得到相同的数字。或
1 << x
始终相等
1 << x % 32 (% is the mod)
因此,1 << 33 === 1 << 1
始终为true
,因为33 % 32 == 1
。