什么<<班次比班次更远?

时间:2016-03-29 03:46:57

标签: javascript node.js

在节点环境中| 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  

问题:<<运营商如何在这里工作?

3 个答案:

答案 0 :(得分:5)

  

1)&lt;&lt;运营商如何工作?

您可以找到<< within the specification(ECMA 262)的定义。

您问题的关键步骤是:

  

11)让 shiftCount 成为屏蔽rnum除了最低5位之外的所有位的结果,即计算rnum & 0x1F

这意味着第二个操作数不能大于310x1F)。如果是,则在继续之前通过位掩码减少:

(33 & 0x1f) === 1 // true

所以:

1 << 33          // becomes...
1 << (33 & 0x1f) // becomes...
1 << 1
  

2)如何存储内存中的数字?

number in JavaScript是:

  

原始值对应于双精度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