我正在阅读underscore.js代码。我发现了这个:
var mid = (low + high) >> 1;
>> 1
做什么?为什么有用?
答案 0 :(得分:7)
它将左侧的位向右移位一位。相当于除以2。
在'Ye olden times'中,这比简单划分更快,但我怀疑它会在下划线的情况下产生很大的不同。
答案 1 :(得分:1)
这是一个按位正确的转变。对于整数,它相当于除以2;对于JavaScript数字,它与Math.floor((low + high) / 2)
大致相同,但完全避免浮点数。
答案 2 :(得分:1)
>>
是传播右移运营商的标志。它将(low + high)
的位模式向右移动1
位置,最左边的位复制到左侧位置。它实际上与Math.floor((low + high) / 2)
相同。
如果我没有指出使用(low + high) >> 1
来计算二进制搜索中数组的中点可能导致溢出的细微错误,那将是我的疏忽。 (low + high) >>> 1
其中>>>
为零填充右移运算符,没有溢出错误。
答案 3 :(得分:0)
可能会将值保持为整数。在这里除以2可能会在某些情况下将结果转换为浮点数,例如,如果(low + high)
为奇数。
这两项操作并不完全相同:
> (5+2)/2
3.5
> (5+2)>>1
3
但是,对于这种特殊用途,有better idioms用于查找两个数字的中点。