答案 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 ++编译器都会在可能的情况下优化算术运算符到按位运算。我会更担心保持代码的可读性。有时候你会看到这些使用按位运算符编写的“技巧”,以便更清楚地了解这个技巧是如何工作的。