【C++】(以及大多数编程语言)中常见的 六种基本位运算操作
在位运算(bitwise operations)中,按位与(&) 是基础操作之一,它通常和另外几种位运算操作 并列使用,共同构成底层数据处理、硬件控制、压缩编码等场景的核心工具。
以下是 C/C++(以及大多数编程语言)中常见的 六种基本位运算操作,它们地位相当,常配合使用:
1. 按位与(Bitwise AND) — &
- 作用:对两个操作数的每一位执行逻辑“与”。
- 用途:
- 掩码(masking):提取特定位
- 清零某些位(用 0 掩掉)
- 示例:
x & 0x01 // 检查最低位是否为1
x & 0xFE // 清除最低位(保留高7位)
2. 按位或(Bitwise OR) — |
- 作用:对每一位执行逻辑“或”。
- 用途:
- 设置(置1)某些位
- 合并多个标志位
- 示例:
x | 0x01 // 强制最低位置1
flags = ERR_FLAG | TIMEOUT_FLAG; // 组合多个状态标志
3. 按位异或(Bitwise XOR) — ^
- 作用:相同为0,不同为1。
- 用途:
- 翻转特定位(toggle)
- 加密/校验(如简单异或加密)
- 交换两个变量(不用临时变量)
- 示例:
x ^= 0x01 // 翻转最低位(0变1,1变0)
a ^= b; b ^= a; a ^= b; // 交换a和b(不推荐实际使用,仅演示)
4. 按位取反(Bitwise NOT) — ~
- 作用:对一个操作数的所有位取反(0变1,1变0)。
- 用途:
- 构造掩码
- 清除某一位(配合 & 使用)
- 示例:
x & ~0x01 // 清除最低位(等价于 x &= 0xFE)
mask = ~0xF0 // 得到 0x0F(低4位为1)
5. 左移(Left Shift) — <<
- 作用:将所有位向左移动,右侧补0。
- 用途:
- 快速乘以 2ⁿ
- 构造位掩码(如
1 << 3得到0b00001000) - 将数据放到指定位置
- 示例:
1 << 3 // 结果是 8 (0b1000)
reg |= (1 << ENABLE_BIT); // 设置第 ENABLE_BIT 位
6. 右移(Right Shift) — >>
- 作用:将所有位向右移动。
- 对 无符号数:逻辑右移(高位补0)
- 对 有符号数:可能是算术右移(高位补符号位,依赖编译器)
- 用途:
- 快速除以 2ⁿ(整数除法)
- 提取高位数据(如你之前问的
m.data[5] >> 6)
- 示例:
x >> 2 // 相当于 x / 4(向下取整)
(byte >> 4) & 0x0F // 提取高4位
常见组合技巧(实战)
| 目标 | 表达式 |
|---|---|
| 设置第 n 位 | `x |
| 清除第 n 位 | x &= ~(1 << n) |
| 翻转第 n 位 | x ^= (1 << n) |
| 检查第 n 位是否为1 | (x >> n) & 1 或 (x & (1 << n)) != 0 |
| 提取低4位 | x & 0x0F |
| 提取高4位 | (x >> 4) & 0x0F |
为什么位运算性能高?
1. 硬件直接支持
- 所有现代 CPU 都有专门的 ALU(算术逻辑单元) 指令来执行位运算。
- 这些操作通常只需 1 个 CPU 周期(甚至更少),比加减法还快或相当。
- 相比之下,除法、取模、浮点运算可能需要几十甚至上百周期。
2. 无分支(branch-free)
- 位运算不涉及条件跳转(如
if),避免了 分支预测失败(branch misprediction) 的性能惩罚。 - 在高频循环或实时系统中,这点至关重要。
3. 内存友好
- 用 1 个 bit 表示布尔状态,8 个状态可压缩到 1 字节,减少内存占用和缓存压力。
- 更少的内存访问 = 更高的缓存命中率 = 更快的程序。
总结
与 按位与(&) 并列的核心位运算包括:
|(或)、^(异或)、~(非)、<<(左移)、>>(右移)
这六种操作构成了位级编程的基石,广泛应用于:
- 嵌入式系统(寄存器配置)
- 网络协议解析(标志位、字段提取)
- 图形/游戏开发(状态压缩)
- 加密与哈希算法
- 高性能计算(避免分支、优化内存)
