我可以找到 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。
对于正数a
,a >>> 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/