本文最后更新于 2024年5月16日。
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; //推荐