doc here和video here解释了Bitwise operator |
的工作原理。但是,通过阅读链接中提供的简单示例,|
的目的和意义似乎难以理解。
我正在阅读source code of d3.shuffle
,这是一行使用|
:
i = Math.random() * m-- | 0;
基于源代码,这行代码似乎打算将0到m之间的随机索引分配给i
。
我的问题是:
如果这行代码的意图是在0和m之间创建一个随机索引,那么|
如何帮助实现呢?
换句话说,如何理解在这里使用|
的实际用途和含义,因为此刻我不理解为什么,也不能在任何其他情况下使用|
。
重新阐述第二部分:是否有一种逻辑可以帮助理解三行代码?或者我们应该使用四舍五入的理解来理解下面的这三行?如果是这样,怎么样?如果没有,其他两行代码是什么意思?
i = Math.random()* m-- | 0;
i = Math.random()* m-- | 1;
i = Math.random()* m-- | 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--);
他们可能使用过运算符,因为: