C语言中位运算符的性能

C语言中位运算符的性能,c,bit-manipulation,bitwise-operators,C,Bit Manipulation,Bitwise Operators,使字节的最后2位为零的最快方法是什么 x=x>>2取决于许多因素,包括编译器、机器体系结构(即处理器) 我的经验是 x &= 252; // or... x &= ~3; 比以前更高效(更快) 如果你的编译器足够聪明,它可能会取代 x = x >> 2 << 2; 后者比前者快,因为后者只是一条机器指令,而前者是两条。所有位操作指令都可以在一个周期内执行 注: 表达式~3是正确的表达方式:设置了除最后两位之外的所有位的位掩码。对于单字节类型,这相

使字节的最后2位为零的最快方法是什么


x=x>>2取决于许多因素,包括编译器、机器体系结构(即处理器)

我的经验是

x &= 252; // or...
x &= ~3;  
比以前更高效(更快)


如果你的编译器足够聪明,它可能会取代

x = x >> 2 << 2;
后者比前者快,因为后者只是一条机器指令,而前者是两条。所有位操作指令都可以在一个周期内执行


注:

表达式
~3
是正确的表达方式:设置了除最后两位之外的所有位的位掩码。对于单字节类型,这相当于像您那样使用
252
,但是
~3
将适用于
int
之前的所有类型。如果您需要为较大的类型(如
long
)指定这样的位掩码,请在数字中添加适当的后缀,
~3l
对于
long

,我认为真正的问题是:编译器是否能够将第一种情况优化为第二种情况?您必须检查组件才能找到答案。
&=
是一个单独的操作,其中向右然后向左移动是两个操作。我同意:查看程序集以确定。@Mysticial我猜#2在任何一种情况下都是赢家:-)Fwiw,都编译为
和L$0xfc,reg
,这
reg
是从哪个寄存器开始加载字节。(x86上的Clang3.4)您已经用两种方式编写了代码。如果你想知道哪种方式更快,运行代码就知道了。你确定最后一条是一条机器指令吗?@staticx是的,我是。表达式
~3
是常量,编译器会为您计算正确的常量。我使用gcc转储程序集,它们会生成与之相同的程序转储:
gcc-O2-S-c test.c
@cmaster正如我前面提到的,第二个并不总是一条指令
x = x >> 2 << 2;
x &= ~3;