我可以找到关于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;
来查找数组的中间索引吗?>>>
。 由于
答案 0 :(得分:4)
按位运算符>>和>>>通常用于执行2的快速整数除法。
对于正数a
,a >>> n
等于Math.trunc(a / Math.pow(2, n))
与按位移位相比,普通除法运算符相当慢,这就解释了为什么除数是2的倍数时经常使用它。
注意:所有按位运算符都将其操作数转换为32位二进制补码,从而减少了a的有效范围。使用>>>而不是>>保证结果始终为正数,并返回in [0,2 ^ 32-1]的预期结果。当处理索引始终在此范围内的数组时,这是可取的。