【发布时间】:2012-05-27 17:23:40
【问题描述】:
以下哪种技术是整数除以 2 的最佳选择,为什么?
技巧一:
x = x >> 1;
技巧2:
x = x / 2;
这里x是一个整数。
【问题讨论】:
-
如果你真的想再次将结果分配给
x,这两种方式都不合适:它应该是x >>= 1或x /= 2,这取决于你打算用手术。不是因为它更快(任何现代编译器都会将所有等效变体编译为相同的快速汇编),而是因为它不那么令人困惑。 -
我不同意leftaroundabout。 - 但我认为值得注意的是,在许多编程语言中有一个名为arithmetic shift 的操作将符号位保持在适当的位置,因此可以按预期处理有符号值。语法可能类似于
x = x >>> 1。另请注意,根据平台和编译器,使用移位手动优化除法和乘法可能是相当合理的。 - 考虑微控制器,例如,没有直接 ALU 支持乘法。 -
我更喜欢
x /= 2,因为x >>= 1看起来太像monadic bind ;) -
@leftaroundabout - 我只是认为写
x = x / 2而不是x /= 2更易读。主观偏好可能:) -
@HannoBinder:当然是主观的,尤其是很多习惯。 IMO,在所有算术运算符都具有
⬜=组合的语言中,应尽可能使用这些组合。它消除了噪音并强调x已修改这一事实,而一般的=运算符则建议它采用独立于旧值的全新值。 — 始终避免使用组合运算符(以便它可读,因此只知道数学运算符的人)可能也有它的意义,但是你也需要放弃非常有用的++、--、+=.
标签: c++ c optimization division micro-optimization