在 C 语言中,位运算符(Bitwise Operators)用于对整数类型(如 int
, unsigned int
, long
, char
等)的二进制位进行操作。这些操作比算术运算更底层,常用于嵌入式开发、驱动开发、图像处理、网络协议、加密等场景。
下面是 C 语言中所有的位运算符及其详解:
运算符 | 名称 | 功能说明 |
---|---|---|
& |
位与(AND) | 两个二进制位都为1,结果才为1 |
` | ` | 位或(OR) |
^ |
位异或(XOR) | 两个二进制位不同,结果为1;相同则为0 |
~ |
位取反(NOT) | 把每一个二进制位取反(0变1,1变0) |
<< |
左移 | 把二进制位向左移动n位,右侧补0 |
>> |
右移 | 把二进制位向右移动n位,左侧视符号位补0或补1(有符号类型) |
&
int a = 6; // 00000110
int b = 3; // 00000011
int c = a & b; // 00000010 => 2
说明:只有两个数的对应位都为1时结果才为1。
用途:常用于**位掩码(mask)**操作,比如提取特定位。
|
int a = 6; // 00000110
int b = 3; // 00000011
int c = a | b; // 00000111 => 7
说明:只要有一位为1,结果就是1。
用途:常用于设置某些位为1。
^
int a = 6; // 00000110
int b = 3; // 00000011
int c = a ^ b; // 00000101 => 5
说明:相同为0,不同为1。
用途:
清除相同的位
交换两个值而不用临时变量(见技巧)
~
int a = 6; // 00000110
int b = ~a; // 11111001 (补码) => -7
说明:每一位都取反。
注意:结果是补码形式,需注意符号位。
<<
int a = 3; // 00000011
int b = a << 1; // 00000110 => 6
说明:相当于 乘以2的n次方,比如 a << 3
等价于 a * 8
。
>>
int a = 8; // 00001000
int b = a >> 2; // 00000010 => 2
说明:相当于 除以2的n次方,对正数效果一致。
⚠️ 有符号数右移时,符号位可能会扩展(即负数右移高位补1),称为算术右移。而无符号数右移通常为逻辑右移(高位补0)。
if (a & (1 << n)) {
// 第 n 位是 1
}
a |= (1 << n);
a &= ~(1 << n);
int bit = (a >> n) & 1;
a = a ^ b;
b = a ^ b;
a = a ^ b;
只能用于整数类型,不能直接对浮点数、指针等进行位操作。
运算优先级较低,在表达式中建议使用括号明确运算顺序。
使用位移时,小心超出位数范围可能导致未定义行为。
#define READ 0x01 // 00000001
#define WRITE 0x02 // 00000010
#define EXECUTE 0x04 // 00000100
int permission = READ | WRITE;
// 检查是否有写权限
if (permission & WRITE) {
printf("Can write\n");
}
// 关闭写权限
permission &= ~WRITE;