右移速度与左移相同的速度测试位

test bit by right shift same speed as left shift?

本文关键字:速度 测试 左移 右移      更新时间:2023-10-16

是这样做

的速度相同的速度
#define CHECK_BIT_BOOL(var,pos) ((var>>(pos)) & 1)

AS

#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))

目标是不使用Bool宏,例如:

#define BOOL(x) (!(!(x)))
BOOL(CHECK_BIT(foo, 3));

做得更好: CHECK_BIT_BOOL(foo,3);

一般测试比特问题

当前C编译器在将典型代码转换为最佳机器语言时非常聪明。大多数时候,试图超越编译器将其混淆为生成愚蠢的代码。

Modern CPU一次可以执行多个操作,无论使用其他操作的时间,其他操作都可能会被其他操作所掩盖,并且没有任何区别。的CPU比内存快得多,大多数程序被内存访问比计算更慢。

您的时间编程比通过此类微型量化的运行时收益的任何收益都要有价值得多,除非代码每天在数百万台机器上运行数千次。专注于简单,干净,明显的正确和可理解的代码。下周阅读时,您将非常感谢。

如果pos是常数,则CHECK_BIT的速度可能更快,因为无需在运行时进行班次。否则,两者都可能相同。但是,正如您指出的那样,如果您需要将结果约束为零,则需要在CHECK_BIT之后进行更多工作。

当然,这取决于您的目标平台,如果您的性能要求足够严格以保证担心单个处理器指令的成本,则您必须对真实系统上的真实性能进行介绍和衡量。

check_bit_bool,如果var和pos不在内存中,而是在寄存器中,则check_bit非常快。即使它在内存中 - 您无法更快地获得它(如果VAR为1个字节,您可以通过仅返回结果[VAR 256*8]立即创建256*8结果和返回结果做>>和&amp;)。