10
位运算:直接掰扯二进制
Bitwise Operations
CPU 最底层就是跟 0 和 1 打交道。位运算让你直接操作每个二进制位,在嵌入式、网络协议、压缩、加密、状态压缩里天天用。五个运算符先认脸。
| 运算符 | 含义 | 例子(a=0110, b=0011) |
|---|---|---|
& 与 | 两位都 1 才是 1 | a & b = 0010 |
| 或 | 有一个 1 就是 1 | a | b = 0111 |
^ 异或 | 不同为 1,相同为 0 | a ^ b = 0101 |
~ 取反 | 0 变 1,1 变 0 | ~a |
<< >> 移位 | 左移乘 2,右移除 2 | a << 1 = 1100 |
几个实战技巧
判奇偶、不借临时变量交换、清掉最低位的 1
// 1) 判断奇偶:看最低位是不是 1
if (n & 1) printf("奇数\n");
else printf("偶数\n");
// 2) 不用临时变量交换两个数(利用异或:a^a=0, a^0=a)
a = a ^ b;
b = a ^ b;
a = a ^ b;
// 3) x & (x-1) 会把 x 最低位的那个 1 消掉——判断"是不是 2 的幂"超好用
// 8 (1000) & 7 (0111) = 0 → 说明 8 是 2 的幂
int is_power_of_two = (n > 0) && ((n & (n - 1)) == 0);
用位标志存一堆"是/否"开关(权限位)
#define READ 1 // 001
#define WRITE 2 // 010
#define EXEC 4 // 100
int perm = READ | WRITE; // 组合:011,同时有读和写权限
if (perm & WRITE) printf("可以写\n"); // 用 & 检查有没有某权限