我正在从 C 中的一个字节中提取第 8 位。这是我的示例。
register unsigned char byte;
int pos = 7;
int x =(byte >> pos) & 1; //Method I
int y =(byte & 0x80) >> pos; //Method II
两种技术都会产生相同的输出,但其中一种方法是否比另一种更有效?
我正在从 C 中的一个字节中提取第 8 位。这是我的示例。
register unsigned char byte;
int pos = 7;
int x =(byte >> pos) & 1; //Method I
int y =(byte & 0x80) >> pos; //Method II
两种技术都会产生相同的输出,但其中一种方法是否比另一种更有效?
两者都是一样的。AND 和 SHR 指令都是英特尔 CPU 上的 1 时钟指令。
如果您知道在编译时要提取的位,那么任何一种方法都应该具有大致相同的速度:
unsigned char val;
const int pos = 4;
...
int x = (val >> pos) & 1;
int y = (val & 0x10) >> pos;
但是,如果您在运行时计算位置而不是常数,则最后执行 AND 应该更快:
unsigned char val;
int pos;
...
/* requires only a shift and AND */
int x = (val >> pos) & 1;
/* requires two shifts and AND */
int y = (val & (1 << pos)) >> pos;
按位运算基本上是您在计算机上可以找到的最快的事情之一。我想任何差异都会非常小,因此这并不重要。