2

我正在从 C 中的一个字节中提取第 8 位。这是我的示例。

register unsigned char byte;

int pos = 7;

int x =(byte >> pos) & 1;   //Method I

int y =(byte & 0x80) >> pos;    //Method II

两种技术都会产生相同的输出,但其中一种方法是否比另一种更有效?

4

3 回答 3

4

两者都是一样的。AND 和 SHR 指令都是英特尔 CPU 上的 1 时钟指令。

于 2013-03-20T02:43:12.497 回答
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;
于 2013-03-20T23:42:32.570 回答
1

按位运算基本上是您在计算机上可以找到的最快的事情之一。我想任何差异都会非常小,因此这并不重要。

于 2013-03-20T02:44:43.543 回答