如何理解d3中的'零填充右移' (' >>> ').平分线的源代码
How to make sense of `Zero-fill right shift` (`>>>`) in `d3.bisector` source code?
我可以找到关于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
这些例子似乎证实了这个假设。所以,这是我的问题
- 是
var mid = lo + hi >>> 1;
找到一个数组的中间索引? - 如果是,那么这种操作为什么以及如何实现它?在这个阶段,这段代码就像一个黑盒子,我知道它的目的或结果是什么,但我不明白为什么,我也不能在任何其他情况下使用
>>>
。
谢谢
位运算符>>和>>>通常用于快速除2整数。
对于正数a
, a >>> n
= Math.trunc(a / Math.pow(2, n))
普通的除法运算符相对于位移位来说是相当慢的,这解释了为什么除法运算符通常在除数是2的倍数时使用。
注意:所有位运算符都将其操作数转换为32位双补数,从而减小a的有效范围。使用>>>而不是>>保证结果始终是正数,并返回a在[0,2 ^32-1]中的预期结果。当使用索引总是在此范围内的数组时,这是理想的。相关文章:
- 节点Js:How to catch a“;没有这样的文件或目录“;读取线模块出错
- 使用acess代币登录Facebook,并通过网络应用程序离线发布
- 为什么在画布上画线;t出现
- 活动选项卡's源代码-获取变量s值
- 在threejs中使用纹理网格和线框网格
- Moment/Jquery-一个简单时间线的愚蠢问题
- 如何为高图中的区域线创建z索引
- 通过连线将数据从js发送到控制器
- 在javaservlet doPost方法中启动线程时,无法返回异常消息
- 尝试从控制器加载带有json数据的Simile时间线
- 如何使删除线看起来像x
- 谷歌图表API:添加空白行到时间线
- javascript中的多线程
- 带有unix时间戳的d3.js平分线
- Firebase 离线缓存和原始 Firebase.js源代码
- D3 平分线不适用于对象数组
- D3:什么是平分线
- 什么是“;平分线”;以及“;heapselect”;Crossfilter中的工具
- 找出平分线与图像的特定区域相交的位置
- 如何理解d3中的'零填充右移' (' >>> ').平分线的源代码