Z
ZHANK
高级技巧

位运算深入

按位与/或/异或/取反/移位、位标志、状态压缩

位运算深入

位运算是 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 的幂 */;