【18】C语言位运算符详解
【18】C语言位运算符详解
 
文章目录
- 一、基本位运算符
- 1.1 按位与(&)
- 1.2 按位或(|)
- 1.3 按位异或(^)
- 1.4 按位取反(~)
 
- 二、移位运算符
- 2.1 左移(<<)
- 2.2 右移(>>)
 
- 三、实用示例
- 3.1 位操作常用技巧
- 3.2 完整示例程序
 
- 四、注意事项
位运算符是C语言中用于直接操作二进制位的运算符,它们对整型数据的二进制表示进行位级别的操作。位运算符在嵌入式开发、加密算法、图形处理等领域有广泛应用,掌握它们对于编写高效的低级代码非常重要。
一、基本位运算符
1.1 按位与(&)
int a = 5;    // 二进制: 0101
int b = 3;    // 二进制: 0011
int result = a & b;  // 结果: 0001 (十进制1)
真值表:
0 & 0 = 0
0 & 1 = 0  
1 & 0 = 0
1 & 1 = 1
应用场景:
- 检查特定位是否为1
- 清除特定位(用0与目标位进行与操作)
1.2 按位或(|)
int a = 5;    // 二进制: 0101
int b = 3;    // 二进制: 0011
int result = a | b;  // 结果: 0111 (十进制7)
真值表:
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
应用场景:
- 设置特定位为1
1.3 按位异或(^)
int a = 5;    // 二进制: 0101
int b = 3;    // 二进制: 0011
int result = a ^ b;  // 结果: 0110 (十进制6)
真值表:
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
特性:
- 相同为0,不同为1
- 任何数与0异或保持不变
- 任何数与自己异或结果为0
1.4 按位取反(~)
int a = 5;    // 二进制: 0000 0101
int result = ~a;     // 结果: 1111 1010 (取决于整数位数)
应用场景:
- 求补码(负数表示)
- 位反转操作
二、移位运算符
2.1 左移(<<)
int a = 5;    // 二进制: 0101
int result = a << 2; // 结果: 10100 (十进制20)
特性:
- 左移n位相当于乘以2ⁿ
- 空出的低位补0
2.2 右移(>>)
int a = 20;   // 二进制: 10100
int result = a >> 2; // 结果: 00101 (十进制5)
特性:
- 右移n位相当于除以2ⁿ(向下取整)
- 对于有符号数,高位补符号位(算术右移)
- 对于无符号数,高位补0(逻辑右移)
三、实用示例
3.1 位操作常用技巧
// 设置第n位为1
x = x | (1 << n);// 清除第n位(设为0)
x = x & ~(1 << n);// 切换第n位(0变1,1变0)
x = x ^ (1 << n);// 检查第n位是否为1
if (x & (1 << n)) {// 第n位为1
}// 检查奇偶性
if (x & 1) {// 奇数(最低位为1)
} else {// 偶数(最低位为0)
}
3.2 完整示例程序
#include <stdio.h>void printBinary(int num) {for (int i = 31; i >= 0; i--) {printf("%d", (num >> i) & 1);if (i % 4 == 0) printf(" ");}printf("\n");
}int main() {int a = 29;  // 二进制: 0001 1101int b = 15;  // 二进制: 0000 1111printf("a = %d, 二进制: ", a);printBinary(a);printf("b = %d, 二进制: ", b);printBinary(b);printf("a & b = %d, 二进制: ", a & b);printBinary(a & b);printf("a | b = %d, 二进制: ", a | b);printBinary(a | b);printf("a ^ b = %d, 二进制: ", a ^ b);printBinary(a ^ b);printf("~a = %d, 二进制: ", ~a);printBinary(~a);printf("a << 2 = %d, 二进制: ", a << 2);printBinary(a << 2);printf("a >> 2 = %d, 二进制: ", a >> 2);printBinary(a >> 2);return 0;
}
四、注意事项
- 运算符优先级: 位运算符的优先级低于算术运算符
- 移位位数限制: 移位位数应小于操作数的位数
- 有符号数右移: 结果依赖于具体实现(算术右移或逻辑右移)
- 负数移位: 可能产生未定义行为,需谨慎处理
