我可以在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


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


var mid = lo + hi >>> 1;查找数组的中间索引?
如果是这样,那么为什么以及如何实现这一目标呢?在这个阶段,这段代码就像一个黑匣子,我知道它的目的或结果的用途,但是我不知道为什么,在任何其他情况下都不能使用>>>


谢谢

最佳答案

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

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

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

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

关于javascript - 如何在d3.bisector源代码中理解“零填充右移”(`>>>`)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38156015/

10-11 12:22