后端
C语言位运算
位运算基础
说明:常见于寄存器操作
&:按位与
- 功能描述:对两个操作数的对应位进行与操作,只有当两位都为1时结果才为1
- 示例:1010 & 1100 = 1000
- 应用场景:位掩码、判断奇偶性、清除特定位
|:按位或
- 功能描述:对两个操作数的对应位进行或操作,只要有一位为1结果就为1
- 示例:1010 | 1100 = 1110
- 应用场景:设置特定位、合并位信息
^:按位异或
- 功能描述:对两个操作数的对应位进行异或操作,当两位不同时结果为1
- 示例:1010 ^ 1100 = 0110
- 应用场景:交换变量、翻转特定位、加密
~:按位取反
- 功能描述:对操作数的每一位取反,0变1,1变0
- 示例:~1010 = 0101(取决于数据类型长度)
- 应用场景:生成掩码、位取反操作
<<:左移
- 功能描述:将操作数的所有位向左移动指定的位数,右侧补0
- 示例:1010 << 2 = 101000
- 应用场景:乘以2的幂次、位运算优化
>>:右移
- 功能描述:将操作数的所有位向右移动指定的位数,左侧补符号位(有符号数)或补0(无符号数)
- 示例:1010 >> 2 = 0010
- 应用场景:除以2的幂次、位运算优化
位运算优先级
优先级1:~(按位取反)
- 结合性:右到左
优先级2:<<, >>(左移、右移)
- 结合性:左到右
优先级3:&(按位与)
- 结合性:左到右
优先级4:^(按位异或)
- 结合性:左到右
优先级5:|(按位或)
- 结合性:左到右
位运算示例代码
基本位运算示例
c
#include <stdio.h>
int main() {
unsigned int a = 10; // 二进制: 1010
unsigned int b = 12; // 二进制: 1100
printf("a & b = %u\n", a & b); // 按位与
printf("a | b = %u\n", a | b); // 按位或
printf("a ^ b = %u\n", a ^ b); // 按位异或
printf("~a = %u\n", ~a); // 按位取反
printf("a << 2 = %u\n", a << 2); // 左移
printf("a >> 2 = %u\n", a >> 2); // 右移
return 0;
}位运算应用示例
c
#include <stdio.h>
// 判断一个数是否为奇数
int is_odd(int num) {
return num & 1;
}
// 设置第n位为1
int set_bit(int num, int n) {
return num | (1 << n);
}
// 清除第n位为0
int clear_bit(int num, int n) {
return num & ~(1 << n);
}
int main() {
int num = 10;
printf("是否为奇数: %s\n", is_odd(num) ? "是" : "否");
printf("设置第2位后: %d\n", set_bit(num, 2));
printf("清除第1位后: %d\n", clear_bit(num, 1));
return 0;
}