1. 位运算基础与核心操作符解析
位运算作为计算机底层最基础的操作之一,在算法优化、系统编程、嵌入式开发等领域有着不可替代的作用。我第一次真正体会到位运算的威力是在处理一个千万级数据的去重问题时,用传统的哈希表方法内存直接爆了,而改用位图法后内存消耗降到了原来的1/32。
1.1 六大基础位操作符详解
按位与(&) 这个操作符我习惯称之为"掩码提取器"。比如我们想获取一个整数的最低4位:
python复制num = 0b11011010
mask = 0b00001111
result = num & mask # 输出: 0b00001010
在图像处理中,这个操作常用于提取特定颜色通道。我曾经用这个方法实现了快速的ARGB通道分离,比用除法取模快了近10倍。
按位或(|) 这是我最常用的"位组合器"。在游戏开发中,我们经常用它来组合状态标志:
c++复制#define FLAG_A 0b00000001
#define FLAG_B 0b00000010
#define FLAG_C 0b00000100
int state = FLAG_A | FLAG_C; // 同时设置A和C标志
按位异或(^) 这个操作有个神奇的特性:a ^ b ^ b = a。我在做数据加密时经常利用这个特性:
java复制// 简单的数据加密
int data = 12345;
int key = 0xDEADBEEF;
int encrypted = data ^ key;
int decrypted = encrypted ^ key; // 解密后得到原数据
按位取反(~) 这个操作符新手最容易踩坑。记得我第一次使用时:
python复制x = 5
print(~x) # 输出-6而不是2
这是因为计算机使用补码表示负数。在嵌入式开发中,我们常用它来反转IO口状态。
左移(<<) 这是性能优化利器。在写高性能计算代码时,我经常用左移代替乘法:
c复制int x = 7;
int y = x << 3; // 相当于x*8
但要注意溢出问题,我曾经因此导致过一个线上事故。
右移(>>) 分为逻辑右移和算术右移。在处理有符号数时要特别注意:
java复制int x = -16;
int y = x >> 2; // 算术右移,结果是-4
int z = x >>> 2; // 逻辑右移,结果是1073741820
1.2 操作符优先级陷阱
位运算符的优先级常常让人栽跟头。来看这个真实案例:
python复制a = 1 | 2 == 3 # 你以为结果是3,实际是False
正确的写法应该是:
python复制a = (1 | 2) == 3
重要提示:建议在所有位运算表达式中都显式使用括号,我在代码审查时发现这是最常见的错误来源之一。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 位运算的实用技巧大全
2.1 常用位操作模板
判断奇偶 这个技巧我在算法竞赛中用了无数次:
c++复制bool isOdd = (x & 1); // 比x%2快得多
交换两个数 不用临时变量的优雅解法:
python复制a ^= b
b ^= a
a ^= b
虽然现代编译器优化后性能差异不大,但在资源受限的嵌入式系统中仍然有用。
