文章目录
C++位运算的全面汇总,整合了核心概念、进阶技巧与实战应用:
一、基础概念与运算符
1. 基本位运算符
| 运算符 | 名称 | 规则 | 示例(二进制) |
|---|---|---|---|
& | 按位与 | 两位均为1时结果为1 | 0101 & 0011 = 0001(1) |
\| | 按位或 | 任一位为1时结果为1 | 0101 | 0011 = 0111(7) |
^ | 按位异或 | 两位不同时结果为1 | 0101 ^ 0011 = 0110(6) |
~ | 按位取反 | 每位取反(注意符号位影响) | ~0101 → 1010(-6,8位补码) |
<< | 左移 | 左移n位,右侧补0 | 5 << 1 → 10(0101→1010) |
>> | 右移 | 无符号数补0,有符号数通常补符号位 | -5 >> 1 → -3(补码右移) |
2. 底层机制
- 补码表示:负数的二进制形式为绝对值的补码(取反+1),例如:
-5 → 原码: 1000 0101 → 反码: 1111 1010 → 补码: 1111 1011(8位) - 符号位影响:右移有符号数时保留符号位(算术右移),
~5结果为-6。
二、核心应用场景
1. 基础应用
-
位掩码与权限控制:
enum Flags { READ = 1<<0, WRITE = 1<<1, EXEC = 1<<2 }; int perm = READ | WRITE; // 设置权限 if (perm & WRITE) { ... } // 检查权限 perm &= ~EXEC; // 清除权限 -
快速计算:
- 判断奇偶:
if (n & 1) { /* 奇数 */ } - 交换变量:
a ^= b; b ^= a; a ^= b;(需确保&a != &b) - 判断2的幂:
(n & (n-1)) == 0 && n != 0
- 判断奇偶:
2. 数据结构优化
- 位字段(节省内存):
struct Packed { unsigned a : 1; // 1位 unsigned b : 3; // 3位 }; - 位图(Bitmap):
bitset<1000> visited; // 仅占用125字节 visited.set(42); // 标记第42位
三、进阶技巧与优化
1. 算法优化
-
快速幂算法(时间复杂度O(log n)):
int pow(int base, int exp) { int res = 1; while (exp > 0) { if (exp & 1) res *= base; base *= base; exp >>= 1; } return res; } -
寻找唯一出现一次的数(其他数出现两次):
int singleNumber(vector<int>& nums) { int res = 0; for (int num : nums) res ^= num; return res; }
2. 硬件与协议操作
- 寄存器定义(通过位域):
struct EthernetHeader { uint64_t dest_mac : 48; // 6字节 uint64_t src_mac : 48; uint16_t eth_type; } __attribute__((packed)); // 禁止内存对齐
四、常见陷阱与解决方案
| 陷阱 | 原因 | 解决方案 |
|---|---|---|
| 符号位污染 | 右移有符号数导致符号扩展 | 转为无符号数:(unsigned)x >> n |
| 位移位数越界 | 位移超过类型位数(如x << 32) | 使用更大类型:1ULL << n |
| 位字段内存布局不一致 | 编译器填充规则不同 | 手动位掩码操作替代位字段 |
五、实战示例
1. RGB颜色处理
// 合并颜色分量(ARGB格式)
uint32_t rgb_to_int(uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255) {
return (a << 24) | (r << 16) | (g << 8) | b;
}
// 提取红色分量
uint8_t get_red(uint32_t color) {
return (color >> 16) & 0xFF;
}
2. 二进制调试输出
void print_binary(int x) {
for (int i = 31; i >= 0; i--) {
cout << ((x >> i) & 1);
if (i % 8 == 0) cout << ' ';
}
cout << endl;
}
// 输出:-5 → 11111111 11111111 11111111 11111011
六、总结
核心价值
- 性能优化:减少内存占用,加速计算(如位掩码、快速幂)。
- 硬件交互:直接操作寄存器、协议头或压缩数据。
- 算法简化:替代复杂逻辑(如异或交换、统计二进制位)。
注意事项
- 避免未定义行为:如位移越界、有符号数溢出。
- 关注平台差异:右移符号位、位字段内存布局依赖编译器。
- 平衡可读性:复杂位操作需添加注释或封装函数。
C++位运算:应用、优化与注意事项
7342

被折叠的 条评论
为什么被折叠?



