我可以找到关于Zero-fill right shift
操作的资源,即15 >>> 2
如何返回3
。
我有点理解我们是如何用这个运算从15得到3的,但是我不知道这个运算的意义和目的。
在这里我想了解d3.bisector
的逻辑,但d3.bisector
源代码有以下行使用>>>
,我完全不知道它是什么或打算得到:
var mid = lo + hi >>> 1;
根据d3.bisector
这个函数的目的,变量mid
似乎定义了数组a
的中间索引。如果是这种情况,那么应该使用lo + hi >>> 1
来查找中间索引。基于这个假设,我尝试了以下代码:
var a = 0 + 5 >>> 1;
console.log(a); // 2
var a = 0 + 6 >>> 1;
console.log(a); // 3
var a = 1 + 6 >>> 1;
console.log(a); //3
这些例子似乎证实了这个假设。所以,这是我的问题
- 是
var mid = lo + hi >>> 1;
找到一个数组的中间索引? - 如果是,那么这种操作为什么以及如何实现它?在这个阶段,这段代码就像一个黑盒子,我知道它的目的或结果是什么,但我不明白为什么,我也不能在任何其他情况下使用
>>>
。
谢谢
位运算符>>和>>>通常用于快速除2整数。
对于正数a
, a >>> n
= Math.trunc(a / Math.pow(2, n))
普通的除法运算符相对于位移位来说是相当慢的,这解释了为什么除法运算符通常在除数是2的倍数时使用。
注意:所有位运算符都将其操作数转换为32位双补数,从而减小a的有效范围。使用>>>而不是>>保证结果始终是正数,并返回a在[0,2 ^32-1]中的预期结果。当使用索引总是在此范围内的数组时,这是理想的。