javascript - 如何理解 `Zero-fill right shift` (`>>>` ) 在 `d3.bisector` 源代码中?

标签 javascript d3.js

我可以找到 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. 如果是,那么为什么以及如何实现这样的操作?在这个阶段,这段代码就像一个黑盒子,我知道它的目的或结果是什么,但我不明白为什么,也不能在任何其他情况下使用 >>>

谢谢

最佳答案

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

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

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

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

关于javascript - 如何理解 `Zero-fill right shift` (`>>>` ) 在 `d3.bisector` 源代码中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38156015/

相关文章:

javascript - 单击时如何更改表行颜色并在单击另一行时恢复为原来的颜色?

javascript - 无需jquery一次设置多个属性

javascript - D3 过渡 : Fading in and out the colors within a gradient fill

d3.js - 如何在 D3 中获取特定的转换属性

javascript - 过滤数据然后显示路径的搜索框?

javascript - 以编程方式而非声明方式实例化小部件时出现 Dojo 重复 ID 错误

javascript - 如何在 AngularJS 中设置输入的值,而不影响其 ngModel

javascript - PHP 中的 If Else 条件与 Ajax responseText

javascript - d3.js 3D数组插值

d3.js - C3 - 在线图上添加自定义标签