位运算符是 C 语言里非常底层的操作,它直接对变量的二进制位(0 和 1) 进行运算,而不是对整个数值。可以把它理解成 “按比特位算账”,比普通的加减乘除更贴近计算机的底层工作方式。
1. 核心位运算符(共 6 个)
先给你一张清晰的对照表,再逐个解释:
| 运算符 | 名称 | 作用(通俗解释) | 例子(二进制) | ||
|---|---|---|---|---|---|
& | 按位与 | 两位都为 1,结果才是 1,否则 0 | 1010 & 1100 = 1000 | ||
| ` | ` | 按位或 | 只要有一位是 1,结果就是 1,否则 0 | `1010 | 1100 = 1110` |
^ | 按位异或 | 两位不同(一个 0 一个 1)结果为 1,相同为 0 | 1010 ^ 1100 = 0110 | ||
~ | 按位取反 | 0 变 1,1 变 0(单目运算符,只有一个操作数) | ~1010 = 0101(8 位下是补码形式) | ||
<< | 左移 | 所有位向左移 n 位,右边补 0(相当于 ×2ⁿ) | 1010 << 1 = 10100 | ||
>> | 右移 | 所有位向右移 n 位,左边补符号位(相当于 ÷2ⁿ) | 1010 >> 1 = 0101 |
2. 通俗解释 + 代码示例
用整数(十进制转二进制)来举例,更贴近实际使用:
c
运行
#include <stdio.h>
int main() {
// 先定义两个数,方便演示
// 5的二进制:00000101
int a = 5;
// 3的二进制:00000011
int b = 3;
// 1. 按位与 &:只有对应位都为1,结果才是1
// 00000101 & 00000011 = 00000001(十进制1)
printf("a & b = %d\n", a & b);
// 2. 按位或 |:只要有一个位为1,结果就是1
// 00000101 | 00000011 = 00000111(十进制7)
printf("a | b = %d\n", a | b);
// 3. 按位异或 ^:对应位不同则为1,相同则为0
// 00000101 ^ 00000011 = 00000110(十进制6)
printf("a ^ b = %d\n", a ^ b);
// 4. 按位取反 ~:0变1,1变0(注意:int是有符号数,取反后是补码)
// ~00000101 = 11111010(十进制-6,因为有符号数最高位是符号位)
printf("~a = %d\n", ~a);
// 5. 左移 <<:左移1位,右边补0,相当于乘以2
// 00000101 << 1 = 00001010(十进制10)
printf("a << 1 = %d\n", a << 1);
// 6. 右移 >>:右移1位,左边补符号位(正数补0),相当于除以2
// 00000101 >> 1 = 00000010(十进制2)
printf("a >> 1 = %d\n", a >> 1);
return 0;
}
运行结果:
plaintext
a & b = 1
a | b = 7
a ^ b = 6
~a = -6
a << 1 = 10
a >> 1 = 2
3. 实用场景(新手能理解的)
- 左移 / 右移:比乘法 / 除法运算更快(计算机底层操作),比如
a << 2等价于a * 4。 - 按位与:判断某一位是 0 还是 1(比如判断奇偶:
a & 1,结果为 1 是奇数,0 是偶数)。 - 按位异或:快速交换两个数(不用临时变量),比如
a = a ^ b; b = a ^ b; a = a ^ b;。 - 按位取反:底层硬件操作、内存操作中常用,新手暂时了解即可。
总结
- 位运算符直接操作二进制位,运算效率极高,是 C 语言贴近底层的体现;
- 核心记住:
&(都 1 才 1)、|(有 1 就 1)、^(不同则 1)、~(取反)、<<(左移乘 2)、>>(右移除 2); - 有符号数的
~和>>要注意符号位(正数补 0,负数补 1),新手先聚焦正数的位运算即可。