C语言位运算符是直接对整数的二进制位进行操作的运算符,运算时直接作用于数据的二进制表示,不需要转换为十进制再进行操作,因此执行效率比普通的算术运算符更高,在嵌入式开发、系统编程、数据处理等领域有广泛应用。

C语言常见位运算符分类
C语言提供的位运算符主要分为六类,分别对应不同的二进制位操作逻辑,具体分类和符号如下:
- 按位与:&
- 按位或:|
- 按位异或:^
- 取反:~
- 左移:<<
- 右移:>>
各运算符运算规则与作用
按位与运算符&
按位与的规则是两个操作数对应的二进制位都为1时,结果位才为1,否则为0。它的常见作用包括清零特定位、获取特定位的值、判断奇偶性。
比如判断一个整数是奇数还是偶数,只需要让该数和1做按位与运算,结果为1则是奇数,结果为0则是偶数:
#include <stdio.h>
int main() {
int num = 7;
// 判断奇偶性,奇数二进制最后一位为1,和1按位与结果为1
if (num & 1) {
printf("%d是奇数n", num);
} else {
printf("%d是偶数n", num);
}
return 0;
}
按位或运算符|
按位或的规则是两个操作数对应的二进制位只要有一个为1,结果位就为1,两个都为0时结果位才为0。它的主要作用是将特定位设置为1。
比如要把一个整数的低4位全部设置为1,只需要让该数和0b1111(十进制15)做按位或运算:
#include <stdio.h>
int main() {
int num = 10; // 二进制为1010
int mask = 15; // 二进制为1111
int result = num | mask; // 结果为1111,十进制15
printf("结果:%dn", result);
return 0;
}
按位异或运算符^
按位异或的规则是两个操作数对应的二进制位不同时结果位为1,相同时结果位为0。它的常见作用包括交换两个变量的值、翻转特定位、数据简单加密。
不用临时变量交换两个变量的经典写法就是利用异或运算:
#include <stdio.h>
int main() {
int a = 3, b = 5;
printf("交换前:a=%d, b=%dn", a, b);
a = a ^ b;
b = a ^ b; // 等价于(a^b)^b = a
a = a ^ b; // 等价于(a^b)^a = b
printf("交换后:a=%d, b=%dn", a, b);
return 0;
}
取反运算符~
取反运算符是单目运算符,规则是将操作数对应的二进制位全部取反,1变0,0变1。需要注意C语言中整数采用补码表示,取反后结果会受符号位影响。
#include <stdio.h>
int main() {
unsigned int num = 0; // 无符号0,二进制全0
printf("取反结果:%un", ~num); // 全1,对应无符号最大值
int signed_num = 0; // 有符号0
printf("有符号取反结果:%dn", ~signed_num); // 结果为-1
return 0;
}
左移运算符<<
左移运算符将操作数的二进制位向左移动指定的位数,高位丢弃,低位补0。左移n位相当于乘以2的n次方,效率比乘法运算高。
#include <stdio.h>
int main() {
int num = 3; // 二进制11
int result = num << 2; // 左移2位,变成1100,十进制12
printf("3左移2位结果:%dn", result); // 3*2^2=12
return 0;
}
右移运算符>>
右移运算符将操作数的二进制位向右移动指定的位数,低位丢弃。对于无符号数,高位补0;对于有符号数,高位补符号位(正数补0,负数补1)。右移n位相当于除以2的n次方,向下取整。
#include <stdio.h>
int main() {
unsigned int u_num = 8; // 二进制1000
int s_num = -8; // 补码表示
printf("无符号8右移2位:%un", u_num >> 2); // 2,8/4=2
printf("有符号-8右移2位:%dn", s_num >> 2); // -2,-8/4=-2
return 0;
}
位运算符使用注意事项
- 位运算符只适用于整数类型(char、short、int、long等),不能用于浮点数。
- 进行位运算时,操作数会自动进行整型提升,运算结果的类型也会对应提升。
- 右移有符号数时,不同编译器对符号位填充的处理可能一致,但标准规定补符号位是合法行为,编写跨平台代码时建议对无符号数使用右移。
- 位运算的优先级低于算术运算符,高于关系运算符和逻辑运算符,混合运算时建议加上括号明确优先级。
| 运算符 | 含义 | 示例 | 结果说明 |
|---|---|---|---|
| & | 按位与 | 5 & 3 | 5是101,3是011,结果为001即1 |
| | | 按位或 | 5 | 3 | 结果为111即7 |
| ^ | 按位异或 | 5 ^ 3 | 结果为110即6 |
| ~ | 取反 | ~5 | 5的补码取反,结果为-6 |
| << | 左移 | 5 << 1 | 101左移1位为1010即10 |
| >> | 右移 | 5 >> 1 | 101右移1位为10即2 |