C语言位运算实用技巧
左移实现乘法
左移n位等价于乘以2的n次方
int x;
x = 2;
x = x << 2;
x = x << 3
使用左移实现乘法运算仅限于乘以2的倍数
是不是只要是左移就能够实现乘以2的倍数呢?
char x = 120;
x = x << 2;
如果执行上面的代码,最终x的值是多少呢?
右移实现除法
右移n位等价于除以2的n次方
int x = 100;
x = x >> 1;
x = x >> 3;
使用右移实现除法运算仅限于除以2的倍数
不使用中间变量交换两个整型变量的值
int a = 5, b = 6;
a = a+b;
b = a-b;
a = a-b;
以上代码看似可以实现两个整型变量数值的交换,但是你能看出其中的Bug吗?
int a = 5, b = 6;
a = a ^ b;
b = a ^ b;
a = a ^ b;
判断整数的奇偶性
x & 1
位操作进行高低位交换
a = (a >> 8) | (a << 8);
寄存器的置位
嵌入式系统总是要用户对变量或寄存器(8位)进行位操作。给定一个变量a,将a的第3个bit位置1(bit位最右边的位第0位),其他位的值不变。
a = a | 0x08
将第三个bit位清零,其他位的值保持不变
a = a & (~0x08)
数据的“拆解”
在数据的传输过程中需要对整型数据进行拆解,例如 int x = 0x1m2345678, 我们需要将x分别拆解成0x12 0x34 0x56 0x78进行传输
x & 0xFF
(x >> 8) & 0xFF
(x >> 16) & 0xFF
(x >> 24) & 0xFF
数据的“组装”
假如我们拿到了被拆解后的数据分别为:0x12 0x34 0x56 0x78, 如果组装成0x12345678呢?
x = 0x12<<24 | 0x34<<16 | 0x56<<8 | 0x78
原文链接:https://blog.csdn.net/weixin_44218779/article/details/125001421
|