如何理解`d3.bisector`源代码中的'零填充右移'(`>>>`)?

时间:2016-07-02 02:44:04

标签: javascript d3.js

我可以找到关于Zero-fill right shift操作的resources,这意味着15 >>> 2返回3的方式。

我有点理解我们如何通过使用此操作从15获得3,但我不知道此操作的含义和目的。

在这里,我想了解d3.bisector的逻辑,但d3.bisector source code使用>>>有以下行,我完全不知道它是为了什么或打算得到它:

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 

这些例子似乎证实了这一假设。所以,这是我的问题

  1. var mid = lo + hi >>> 1;来查找数组的中间索引吗?
  2. 如果是,那么为什么以及如何实现这样的操作呢?在这个阶段,这个代码就像一个黑盒子,我知道它的目的或结果是什么,但我不明白为什么,也不能在任何其他情况下使用>>>
  3. 由于

1 个答案:

答案 0 :(得分:4)

按位运算符>>和>>>通常用于执行2的快速整数除法。

对于正数aa >>> n等于Math.trunc(a / Math.pow(2, n))

与按位移位相比,普通除法运算符相当慢,这就解释了为什么除数是2的倍数时经常使用它。

注意:所有按位运算符都将其操作数转换为32位二进制补码,从而减少了a的有效范围。使用>>>而不是>>保证结果始终为正数,并返回in [0,2 ^ 32-1]的预期结果。当处理索引始终在此范围内的数组时,这是可取的。