位运算深入
按位与/或/异或/取反/移位、位标志、状态压缩
位运算深入
位运算是 C 语言的拿手好戏——直接操作二进制位,极致速度和内存效率。
学完本章你将: 掌握位标志、掩码提取、状态压缩、移位代替乘除。
六个位运算符
c
#include <stdio.h>
int main() {
int a = 0b0101; // 5 (C23 支持二进制字面量;用 0x5 兼容旧标准)
int b = 0b0011; // 3
printf("a & b = %d\n", a & b); // 1 按位与
printf("a | b = %d\n", a | b); // 7 按位或
printf("a ^ b = %d\n", a ^ b); // 6 按位异或
printf("~a = %d\n", ~a); // -6 按位取反
printf("a << 1 = %d\n", a << 1); // 10 左移(*2)
printf("a >> 1 = %d\n", a >> 1); // 2 右移(/2)
return 0;
}
位标志 —— 用一个 int 存 32 个开关
c
#define FLAG_READ (1 << 0) // 0001
#define FLAG_WRITE (1 << 1) // 0010
#define FLAG_EXEC (1 << 2) // 0100
int perm = 0;
// 设置
perm |= FLAG_READ; // 开启读
perm |= FLAG_WRITE; // 开启写
// 检查
if (perm & FLAG_READ) printf("可读\n");
if (perm & FLAG_EXEC) printf("可执行\n"); // 不输出
// 关闭
perm &= ~FLAG_WRITE; // 关闭写
// 切换
perm ^= FLAG_READ; // 反转读
掩码提取
c
int color = 0xFF9933;
int red = (color >> 16) & 0xFF; // 提取红色分量:0xFF
int green = (color >> 8) & 0xFF; // 提取绿色分量:0x99
int blue = color & 0xFF; // 提取蓝色分量:0x33
位运算的高级应用
c
// 快速判断奇偶
if (n & 1) /* 奇数 */;
// 快速交换(不用临时变量)
a ^= b; b ^= a; a ^= b;
// 判断 2 的幂
if (n > 0 && (n & (n - 1)) == 0) /* n 是 2 的幂 */;