按位运算符比+和 - 运算符更快

时间:2013-07-24 12:34:00

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

请参阅Link

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

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

谢谢

5 个答案:

答案 0 :(得分:15)

我确信编译器非常感谢你对这种情况的分析;它绝对不会想到这个!

以下是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

答案 1 :(得分:3)

措施。在你感兴趣的背景下。我一直在努力 乘法比移动快的机器 机器,它从根本上慢。但你不能说出来 面前。就此而言,最新英特尔最快的可能是什么 在下一个出来时不是最快的。 (中的代码 链接是你想要做的事情。不是 可读,不可移植,甚至在其工作的系统上, 它很可能比天真慢 实现。)

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

我不知道Javascript,但任何有价值的C / C ++编译器都会在可能的情况下优化算术运算符到按位运算。我会更担心保持代码的可读性。有时候你会看到这些使用按位运算符编写的“技巧”,以便更清楚地了解这个技巧是如何工作的。