如何理解`d3.shuffle`源代码中的'Bitwise operator |`?

时间:2016-07-02 11:05:36

标签: javascript d3.js

doc herevideo here解释了Bitwise operator |的工作原理。但是,通过阅读链接中提供的简单示例,|的目的和意义似乎难以理解。

我正在阅读source code of d3.shuffle,这是一行使用|

i = Math.random() * m-- | 0;

基于源代码,这行代码似乎打算将0到m之间的随机索引分配给i

我的问题是:

  1. 如果这行代码的意图是在0和m之间创建一个随机索引,那么|如何帮助实现呢?

  2. 换句话说,如何理解在这里使用|的实际用途和含义,因为此刻我不理解为什么,也不能在任何其他情况下使用|

  3. 重新阐述第二部分:是否有一种逻辑可以帮助理解三行代码?或者我们应该使用四舍五入的理解来理解下面的这三行?如果是这样,怎么样?如果没有,其他两行代码是什么意思?

    i = Math.random()* m-- | 0;

    i = Math.random()* m-- | 1;

    i = Math.random()* m-- | 2;

  4. 谢谢!

2 个答案:

答案 0 :(得分:3)

逻辑OR将浮点数截断为32位整数。例如,参见this answer,它建议将浮点数截断为整数的方法。

如何运作

|隐式地将其操作数强制转换为整数,因为它是一个整数位运算符:它需要在32位整数上运行。

除了这种强制之外,带0的逻辑OR是无操作:没有设置在另一个参数中尚未设置的位。

除0以外的其他值会产生影响:

x | 1

这会将x的最低有效位设置为1,因此结果始终为奇数。一些例子:

4 | 1 === 5
5 | 1 === 5
6 | 1 === 7 
7.123 | 1 === 7

另一个例子:

x | 2

这将一个但最低有效位设置为1.该位的值为2,因此这意味着结果将是x本身或x+2

4 | 2 === 6
5 | 2 === 7
6 | 2 === 6
7 | 2 === 7
8 | 2 === 10

以二进制格式查看这些数字,以便更清楚地了解发生的情况:

left argument:  00000100  (=4)
right argument: 00000010  (=2)
outcome of |:   00000110  (=6)

如果且仅当在至少一个参数中设置了相应的位时,结果将设置为位。

有了这个,您可以看到x | 0不会改变x,除了强制转换为整数。因此,此运算符不是用于其主要目的(位设置),而是用于其副作用(强制)。

对大数字的影响

2 32 范围之外的数字(正数或负数)将被映射到该范围,从而导致潜在的意外结果。

答案 1 :(得分:2)

在这种情况下,它只是一种将浮点数截断为整数的方法。

所以你可以把它读作

i = Math.floor(Math.random() * m--);

他们可能使用过运算符,因为:

  1. 它可能更快(需要证据)
  2. 这只是作者对圆形
  3. 的偏好