C语言中位运算符的性能
使字节的最后2位为零的最快方法是什么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是正确的表达方式:设置了除最后两位之外的所有位的位掩码。对于单字节类型,这相
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;