C语言按位清0和置1操作(位运算符合移位运算符组合)

本文最后更新于 2023年10月8日。

algo->algo_start |= (0x1 << 0); // bit0 set 1
algo->algo_start &= ~(0x1 << 0); // bit0 set 0
((algo->algo_start & 0x01) >> 0); // get bit0 num

algo->algo_reset |= (0x1 << 0); // bit0 set 1
algo->algo_reset &= ~(0x1 << 0); // bit0 set 0
((algo->algo_reset & 0x01) >> 0); // get bit0 num

((algo->fire_fis_Vel & 0x01) >> 0); // get bit0 num

位运算符和移位运算符结合——清0和置1
实际开发常见的场景:位清0和位置1

清0公式:

1.将某个数据A的第n位清0,其它位保持不变: A &= ~(0x1 << n);
2.将某个数据A从第n位开始,连续两个bit位清0,其它位保持不变: A &= ~(0x3 << n);
3.将某个数据A从第n位开始,连续三个bit位清0,其它位保持不变: A &= ~(0x7 << n);

置1公式

将某个数据A的第n位置1,其它位保持不变: A |= (0x1 << n);
2.将某个数据A从第n位开始,连续两个bit位置1,其它位保持不变: A |= (0x3 << n);
3.将某个数据A从第n位开始,连续三个bit位置1,其它位保持不变: A |= (0x7 << n);
4.将某个数据A从第n位开始,连续四个bit位置1,其它位保持不变: A |= (0xF << n);

提取bit3的值

要知道一个十六进制数变量a的第3位是0还是1,可以使用按位与运算符&和位移运算符>>来提取该位的值。

首先,使用按位与运算符&和一个掩码来提取第3位的值,掩码可以是一个二进制数,第3位为1,其他位为0。例如,使用掩码0x08来提取第3位的值,即将a的值与掩码0x08按位与运算,然后将结果右移3位。如果结果为1,则表示第3位是1,否则为0。以下是一个示例代码:

#include <stdio.h>

int main() {
   unsigned int a = 0x0B;

   // 提取第3位的值
   int bit3 = (a & 0x08) >> 3;

   printf("a的值:%x\n", a);
   printf("第3位的值:%d\n", bit3);

   return 0;
}

在上面的代码中,我们定义了一个unsigned int类型的变量a,并将其初始值设为0x0B,这是一个二进制数00001011。然后,我们使用按位与运算符&和掩码0x08来提取第3位的值,将结果右移3位。最后,我们使用printf()函数输出原始值和第3位的值。

位(bit)运算符

运算符 类型 解释
& 双目运算符 按位与,相同位的两个数字都为1,则为1;若有一个不为1,则为0。
| 双目运算符 按位或,相同位只要一个为1即为1
~ 单目运算符 按位取非,0,1互换,包括符号位

说明:任何数跟0做位与,结果为0,任何数跟1做位与,保持原值

1.向左移动后右边空出来的数据用0来填充
0x5a << 2 = 01011010 << 2 = 01101000
2.无符号类型数字右移时左边空出来的数据用0来填充
unsigned char a = 0xa5; a >> 2 = 10100101 >> 2 = 00101001
3.有符号类型数字右移时左边空出来的数据用符号位来填充
char a = 0xa5; a >> 2 = 10100101 >> 2 = 11101001
4.移位运算符不会修改变量本身的值
5.只要将来有2的多少次方处理的代码,建议用移位操作
例如:

 3*4; //垃圾代码,CPU运行*,/的效率极低
 3<<2; //高薪代码,CPU运行移位操作效率极高
 12/4; //不推荐
 12>>2; //推荐