位运算
位运算直接操作二进制位,是计算机系统中最基础也是最高效的运算形式。
基本运算符
| 运算符 | C语言符号 | 含义 |
|---|---|---|
| 与 | & | 两个位都为1时结果为1 |
| 或 | | | 两个位中至少一个为1时结果为1 |
| 非 | ~ | 取反:0变1,1变0 |
| 异或 | ^ | 两个位不同时结果为1 |
性质与应用
与运算(&)
- 掩码操作:
x & 0xFF只保留x的最低8位 - 清零:
x & 0结果为0 - 检查特定比特位:
x & (1 << k)用于检查第k位是否为1
或运算(|)
- 置位:
x | (1 << k)将第k位置为1 - 合并比特位:将多个标志位合并为一个整数
异或运算(^)
- 相同为0,不同为1
x ^ x = 0,x ^ 0 = x- 交换律和结合律:
(a ^ b) ^ c = a ^ (b ^ c)
取反运算(~)
~x + 1 = -x(补码中,取反加一即为相反数)- 掩码生成:
~0得到全1(即-1)
Inplace Swap(不使用临时变量交换两个数)
利用异或的性质,可以在不使用额外变量的情况下交换两个整数的值:
void inplace_swap(int *a, int *b) {
*a = *a ^ *b; // a' = a ^ b
*b = *a ^ *b; // b' = (a ^ b) ^ b = a
*a = *a ^ *b; // a'' = (a ^ b) ^ a = b
}注意:当 a 和 b 指向同一地址时,此方法会将值清零(因为 *a ^ *a = 0)。
位运算与逻辑运算的区别
C语言中的逻辑运算符 &&、||、! 与位运算是不同的:
- 逻辑运算将所有非零值视为true(1),零视为false(0),结果为布尔值
- 位运算逐位计算,结果为整数
- 逻辑运算具有短路特性