-1的计算能力

Computing powers of -1

是否有用于实施 (-1)^n * a 的既定习语?

pow(-1,n) * a 的明显选择似乎很浪费,(1-2*(n%2)) * a 也很丑陋且效率不高(两次乘法和一次加法而不是仅设置符号)。我想我现在会选择 n%2 ? -a : a,但是引入条件似乎也有点可疑。

正如其他人所写,在大多数情况下,可读性比性能更重要,编译器、解释器和库比大多数人想象的更擅长优化。因此 pow(-1,n) * a 可能是您平台上的有效解决方案。

如果你真的有性能问题,你自己的建议n%2 ? -a : a就可以了。我看不出有什么理由担心条件赋值。

如果您的语言有按位 AND 运算符,您也可以使用 n & 1 ? -a : a,即使没有任何优化也应该非常高效。在许多平台上,这很可能是 pow(a,b)a == -1b 为整数的特殊情况下实际执行的操作。

对您的编程语言、编译器和 CPU...

做出某些假设

重复传统的——正确的——智慧,甚至不要考虑优化这类事情,除非你的分析工具说它是瓶颈。如果是这样,n % 2 ? -a : a 可能会生成非常高效的代码;即一个 AND、一个针对零的测试、一个否定和一个条件移动,AND+测试和否定独立,因此它们可以同时执行。

另一个选项看起来像这样:

zero_or_minus_one = (n << 31) >> 31;
return (a ^ zero_or_minus_one) - zero_or_minus_one;

这假设 32 位整数、算术右移、整数溢出的定义行为、二进制补码表示等。它也可能编译成四个指令(左移、右移、XOR , 和减法),每个之间都有依赖关系......但对于某些指令集来说可能更好;例如,如果您使用 SSE 指令对代码进行矢量化。

顺便说一下,如果您使用特定语言标记您的问题,您的问题将获得 很多 次查看 - 并且可能会有更多有用的答案。