它的速度是否相同
#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);
答案 0 :(得分:4)
当前的C编译器非常聪明地将典型代码转换为最佳机器语言。大多数时候试图超越编译器会将其混淆为生成愚蠢的代码。
现代CPU一次可以执行多个操作,无论何时耗尽,都可能被其他操作遮挡,并且没有任何区别。并且CPU比内存快 ,大多数程序的内存访问速度比计算速度慢。
除非代码每天在数百万台计算机上运行数千次,否则编程的时间比通过此类微优化获得的运行时获得的价值更有价值。专注于简单,干净,令人难以置信的正确和可理解的代码。下周阅读时,你会感激不尽。
答案 1 :(得分:0)
如果pos
是常量,那么CHECK_BIT
可能会略微加快,因为无需在运行时进行转换。否则,两者都可能是相同的。但正如你所指出的,如果你需要将结果约束为零或一,你需要在CHECK_BIT
之后做更多的工作。
这当然取决于您的目标平台,如果您的性能要求严格到足以担心单处理器指令的成本,则您必须分析和测量真实系统的真实性能。
答案 2 :(得分:-1)
如果var和pos不在内存中但已经在寄存器中,则CHECK_BIT_BOOL和CHECK_BIT非常快。即使它在内存中 - 你也无法更快地获得它(如果var是1个字节,你可以创建256 * 8结果的数组并通过返回结果立即返回结果[var + 256 * 8]但它会比做&gt;&gt;和&amp;)。