【发布时间】:2014-01-29 13:13:22
【问题描述】:
做的速度一样吗
#define CHECK_BIT_BOOL(var,pos) ((var>>(pos)) & 1)
作为
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
目标是不使用 BOOL 宏,例如:
#define BOOL(x) (!(!(x)))
BOOL(CHECK_BIT(foo, 3));
这样做更好:
CHECK_BIT_BOOL(foo,3);
【问题讨论】:
-
我检查了 ICC、Clang 和 GCC,在我测试的所有情况下(这不是全部),它实际上没有区别,例如,发出的代码是完全相等。即使
pos是一个常数。 -
好的,我的用例是 gcc 4.7 和 cpu=cortex-A8 -O3
-
C 有时非常接近硬件。在这种情况下,您的问题基本上归结为“在已知世界的每个 CPU 上,逻辑左移指令占用的 CPU 周期是否与逻辑右移以及布尔 AND 指令一样多?”这样的问题太笼统了,没有任何意义。一般来说,在没有考虑特定系统的情况下谈论优化是没有任何意义的。
-
@DavidBonnin 对于 ARM 来说,这两种方式都是一样的,至少在我测试的情况下以及使用 g++4.6 和 -O2 时是这样。您也可以随时自行检查,看看您的具体情况是否仍然如此。
标签: c++ c boolean bit-manipulation