【问题标题】:What does `>> 1` mean?`>> 1` 是什么意思?
【发布时间】:2011-09-17 05:32:01
【问题描述】:

我正在阅读 underscore.js 代码。我发现了这个:

var mid = (low + high) >> 1;

>> 1 是做什么的?为什么有用?

【问题讨论】:

  • 作者可能认为>> 1会比/ 2更高效。在大多数语言中,这是不正确的;例如,C 编译器可能会为两者生成相同的代码。我不知道这是否同样适用于 JavaScript。
  • @Keith:JavaScript 将切换到浮点值进行除法,因此使用移位可以将所有内容保持在整数范围内,而无需使用 Math.floor

标签: javascript underscore.js


【解决方案1】:

它将左侧的位向右移动一位。相当于除以2。

在“旧时代”中,这比简单的除法要快,尽管我怀疑它会在下划线的情况下产生很大的不同。

【讨论】:

  • 严格来说相当于整数除除以2,向负无穷舍入。 (我不是反对者。)
  • @BioBuckyBall:5 / 2 === 2.5,但5 >> 1 === 2。在 JavaScript 中,将两个整数相除会产生浮点结果。 >> 进行整数除法,而 / 不会。
【解决方案2】:

这是一个按位右移。对于整数,相当于除以二;对于 JavaScript 数字,它与 Math.floor((low + high) / 2) 大致相同,但完全避免了浮点数。

【讨论】:

  • 谢谢。更晦涩的版本是否比你的更高效?
  • @Randomblue:是的,转变应该更快,因为一切都应该以整数完成,它避免了Math.floor 函数调用。我不知道这个区别对于一个体面的 JavaScript 实现是否很重要。
【解决方案3】:

>> 是符号传播右移运算符。它将(low + high) 的位模式右移1 位,并将最左边的位复制到左侧。它实际上与Math.floor((low + high) / 2) 相同。

如果我没有指出使用(low + high) >> 1 计算二进制搜索中数组的中点可能导致溢出的细微错误,那我将是失职。 (low + high) >>> 1 其中>>> 是零填充右移运算符,没有溢出错误。

【讨论】:

【解决方案4】:

它可能是为了将值保持为整数。在某些情况下,此处除以 2 可能会将结果转换为浮点数,例如,如果 (low + high) 为奇数。

这两个操作并不完全等价:

> (5+2)/2
3.5
> (5+2)>>1
3

不过,对于这种特殊用途,有 better idioms 用于查找两个数字的中点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2016-11-18
    • 2019-11-19
    • 2016-09-20
    • 2020-03-08
    • 2019-03-10
    相关资源
    最近更新 更多