位运算模板
与&、或|、异或^、取反~、左移<<、右移>>——用位操作提速
位运算
与
或
异或
移位
GESP3
#include <bits/stdc++.h>
using namespace std;
int main() {
// ====== 1. 位运算符 ======
int a = 5; // 0101
int b = 3; // 0011
cout << (a & b) << endl; // 0001 → 1 (与)
cout << (a | b) << endl; // 0111 → 7 (或)
cout << (a ^ b) << endl; // 0110 → 6 (异或)
cout << (~a) << endl; // 取反
cout << (a << 2) << endl; // 10100 → 20 (左移2=×4)
cout << (a >> 1) << endl; // 0010 → 2 (右移1=÷2)
// ====== 2. 常用技巧 ======
// 判断奇偶
if (a & 1) cout << "奇数" << endl;
else cout << "偶数" << endl;
// 交换两数(不用临时变量)
int x = 3, y = 5;
x ^= y; y ^= x; x ^= y; // x=5, y=3
// 取第 k 位
int n = 13, k = 2; // 13 = 1101
cout << ((n >> k) & 1) << endl; // 第2位是1
// 设置第 k 位为 1
n |= (1 << k);
// 清除第 k 位为 0
n &= ~(1 << k);
// 快速乘除 2 的幂
cout << (a << 3) << endl; // 5×8=40
cout << (a >> 1) << endl; // 5/2=2
// ====== 3. 异或性质 ======
// a ^ a = 0, a ^ 0 = a
// 交换律、结合律
int arr[] = {1,2,3,2,1}; // 只出现一次的数
int ans = 0;
for (int v : arr) ans ^= v;
cout << ans << endl; // 3
return 0;
}
📖 要点说明
<< n等于乘 2ⁿ,>> n等于除 2ⁿ& 1判断奇偶比% 2更快- 异或:相同为0,不同为1;
a^a=0,a^0=a - 异或可找唯一出现一次的数
⚠️ 常见错误
- 位运算优先级低,要加括号:
(a & b)不是a & b - 右移负数行为未定义,避免对负数右移
- 混淆
&(位与) 和&&(逻辑与)