楼层: 首页/ 软件技术/ C 语言/ 位运算:直接掰扯二进制
10

位运算:直接掰扯二进制

Bitwise Operations

CPU 最底层就是跟 0 和 1 打交道。位运算让你直接操作每个二进制位,在嵌入式、网络协议、压缩、加密、状态压缩里天天用。五个运算符先认脸。

运算符含义例子(a=0110, b=0011)
& 与两位都 1 才是 1a & b = 0010
| 或有一个 1 就是 1a | b = 0111
^ 异或不同为 1,相同为 0a ^ b = 0101
~ 取反0 变 1,1 变 0~a
<< >> 移位左移乘 2,右移除 2a << 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"); // 用 & 检查有没有某权限