位运算通过操作二进制位提升效率,常用于优化与底层编程。C++支持&(与)、|(或)、^(异或)、~(取反)、(右移)等运算符。常用技巧包括:用n & 1判断奇偶,a ^ b ^ b实现交换,n & (n - 1)清除最低位的1,n & (-n)提取最低位的1,n > 0 && (n & (n - 1)) == 0判断2的幂,以及用mask遍历子集。实际应用如异或求唯一数、位标记权限等,广泛用于算法与系统编程。

在C++中,位运算是直接对整数的二进制位进行操作的技术,效率高、速度快,常用于优化算法和底层编程。掌握位运算不仅能提升代码性能,还能简化某些逻辑判断。下面介绍常用位运算符及其技巧与实际应用。
基本位运算符
以下是C++中支持的位运算符:- &(按位与):两个对应位都为1时结果才为1
- |(按位或):任一对应位为1则结果为1
- ^(按位异或):对应位不同时为1,相同时为0
- ~(按位取反):每一位0变1,1变0
- :左移n位相当于乘以2^n
- >>(右移):右移n位相当于除以2^n(向下取整)
例如:
int a = 5; // 二进制: 101int b = 3; // 二进制: 011
cout
cout
cout
cout
常用技巧与应用场景
1. 判断奇偶性
通过判断最低位是否为1来确定奇偶:
立即学习“C++免费学习笔记(深入)”;
if (n & 1) {cout
} else {
cout
}
2. 交换两个数不用临时变量
利用异或的性质:a ^ a = 0,a ^ 0 = a
a = a ^ b;b = a ^ b; // 相当于 a ^ b ^ b = a
a = a ^ b; // 相当于 a ^ b ^ a = b
3. 清零最低位的1
表达式 n & (n - 1) 可以快速去掉最右边的1,常用于统计1的个数:
int count = 0;while (n) {
n &= (n - 1);
count++;
}
4. 获取最低位的1
n & (-n) 可以提取最右边的1:
int lowbit = n & (-n);5. 判断是否为2的幂
一个数是2的幂当且仅当只有一个1,且大于0:
bool isPowerOfTwo(int n) {return n > 0 && (n & (n - 1)) == 0;
}
6. 遍历子集(状态压缩)
在枚举某个集合的所有子集时,可以用位运算表示每个元素选或不选:
for (int mask = 0; maskfor (int i = 0; i
if (mask & (1
// 处理第i个元素被选中的情况
}
}
}
实际应用举例
1. 数组中唯一只出现一次的数
给定一个数组,除了一个数出现一次外,其余都出现两次,找出那个数。
int singleNumber(vectorint result = 0;
for (int num : nums) {
result ^= num;
}
return result;
}
利用异或的自反性和交换律,相同数抵消,剩下唯一的数。
2. 标记状态(如权限控制)
用一个整数的不同位表示不同权限:
const int READ = 1const int WRITE = 1
const int EXEC = 1
int permissions = READ | WRITE; // 赋予读写权限
if (permissions & EXEC) { ... } // 检查是否有执行权限
基本上就这些常见用法。位运算看似简单,但组合起来非常强大,尤其在算法竞赛和系统编程中很实用。关键是理解每种操作的本质,并多加练习。










