在实际开发中,常常用移位操作代替乘除法,因为一般情况下:
1.从效率上看,使用移位指令有更高的效率,因为移位指令占2个机器周期,而乘除法指令占4个机器周期。
2.从硬件上看,移位对硬件更容易实现,所以会用移位,移一位就乘2,这种乘法当然考虑移位了。
详细文章可以参考这个博客:https://blog.youkuaiyun.com/louxuez/article/details/24434207
下面想补充下,常使用移位操作增删对应的比特位,一个效率更高,第二个节省内存。下面举两个例子分别说明:
1.移位操作之增加对应比特位
这个比较好理解,也比较容易操作,直接位与就是了。
例子:将int类型的32位中的第1位和第三位变成1,即0x0000000a 十六进制a = 1010
#include <stdio.h>
#define ONE 1
#define TRE 3
int main(void)
{
int temp;
temp = (1 << ONE) | (1 << TRE);
printf("temp=0x%x\n",temp);
return 0;
}
结果:
2.移位操作之删除对应比特位
将int类型temp的32位中第三位变成0,即0x0000000a 变成0x00000002 即十六进制a = 1010 --> 0010
#include <stdio.h>
#define ONE 1
#define TWO 2
#define TRE 3
#define FOER 4
#define FIVE 5
int main(void)
{
int temp = 0xa;
temp = temp & ~(1 << TRE); //TRE位清0
printf("temp=0x%x\n",temp);
return 0;
}
结果: