0

请参考链接

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

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

谢谢

4

5 回答 5

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
于 2013-07-24T12:39:44.443 回答
5

措施。在您感兴趣的上下文中。我曾在乘法比移位更快的机器上工作过,而在它的机器上它的速度要慢得多。但你不能提前说出来。就此而言,最新的英特尔上最快的可能不是下一个问世的最快的。(链接中的代码是你不想做的事情。它不可读,不可移植,即使在它工作的系统上,它也很有可能比幼稚的实现慢。)

于 2013-07-24T13:18:41.293 回答
2

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

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

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

于 2013-07-24T12:39:35.223 回答
1

在大多数现代架构上,按位运算符喜欢&|与算术+-. 在许多现代 cpu 中,所有这些操作都需要一个 cpu 周期。

于 2013-07-24T12:36:48.283 回答
1

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

于 2013-07-24T12:44:52.660 回答