如何理解d3中的'零填充右移' (' >>> ').平分线的源代码

How to make sense of `Zero-fill right shift` (`>>>`) in `d3.bisector` source code?

本文关键字:源代码 平分线 d3 何理解 中的 填充 右移      更新时间:2023-09-26

我可以找到关于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 

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

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

谢谢

位运算符>>和>>>通常用于快速除2整数。

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

普通的除法运算符相对于位移位来说是相当慢的,这解释了为什么除法运算符通常在除数是2的倍数时使用。

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