-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 == -1
和 b
为整数的特殊情况下实际执行的操作。
对您的编程语言、编译器和 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 指令对代码进行矢量化。
顺便说一下,如果您使用特定语言标记您的问题,您的问题将获得 很多 次查看 - 并且可能会有更多有用的答案。
是否有用于实施 (-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 == -1
和 b
为整数的特殊情况下实际执行的操作。
对您的编程语言、编译器和 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 指令对代码进行矢量化。
顺便说一下,如果您使用特定语言标记您的问题,您的问题将获得 很多 次查看 - 并且可能会有更多有用的答案。