【问题标题】:Are bitwise operators faster than + and - operator [closed]按位运算符是否比 + 和 - 运算符快 [关闭]
【发布时间】:2013-07-23 22:32:57
【问题描述】:

请参考Link

建议计算数字绝对值的最快方法是使用(相对困难的)位运算符。

我知道按位运算符比除法和乘法更快。但它们是否比 + 和 - 运算符更快?

谢谢

【问题讨论】:

  • 可能会,但这取决于您的架构以及可能的许多其他情况。
  • 负值右移由实现定义,因此不可移植
  • @ppk:这取决于您的架构以及可能的许多其他情况。在某些情况下是这样,在某些情况下不是,在某些情况下是相反的。
  • 为什么这个标签是javascript?

标签: javascript c++ c bit-manipulation bit-shift


【解决方案1】:

我相信编译器会非常感谢您对这种情况的分析;它肯定不会想到这一点!

这是 GCC 对此的看法:

int myabs(int n)
{
  return n < 0 ? -n : n;   // hurray, portable code!
}

变成:

mov edx, edi     ;; edx = x
sar edx, 31      ;; edx >>= 31
mov eax, edx
xor eax, edi
sub eax, edx     ;; eax = (x ^ (x >> 31)) - (x >> 31)
ret              ;; return eax

【讨论】:

    【解决方案2】:

    测量。在您感兴趣的上下文中。我已经研究过 乘法比移位更快的机器,以及 机器速度非常慢。但你说不出来 正面。就此而言,最新的英特尔上最快的可能是 下一个出来的不是最快的。 (代码在 链接是您想做的事情。它不是 可读,它不是可移植的,甚至在它工作的系统上, 很有可能它比天真的慢 实施。)

    【讨论】:

      【解决方案3】:

      在您今天遇到的几乎任何平台上,按位运算都与加法和减法一样快; ALU 可以在一个周期内完成所有这些工作。一些平台(尤其是 ARM)也可以在与另一个操作相同的周期内进行移位。

      乘法和除法可能需要也可能不需要更长的时间;因平台而异。

      但请注意,编译器通常知道执行此类简单操作的最快方法,因此通常不值得尝试此类微优化;很容易意外破坏编译器的优化并产生较慢的代码。

      【讨论】:

        【解决方案4】:

        在大多数现代架构中,&amp;| 等位运算符与算术 +- 一样快。在很多现代 cpu 中,所有这些操作都需要一个 cpu 周期。

        【讨论】:

          【解决方案5】:

          我对 Javascript 一无所知,但任何值得称道的 C/C++ 编译器都会在可能的情况下将算术运算符优化为按位运算。我会更担心保持您的代码可读性。有时您会看到这些用位运算符编写的“技巧”,以便更清楚地了解这些技巧的工作原理。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-07-16
            • 1970-01-01
            • 1970-01-01
            • 2012-07-20
            • 2012-06-18
            • 2012-03-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多