好嘞 👍 你问到的 C++ 位运算符,其实是底层操作里最常用的一类。它们直接对整数的二进制位进行操作,比算术运算更接近硬件。
🔑 C++ 位运算符总览
| 运算符 | 名称 | 含义 | 示例(假设 a = 6 (0110₂), b = 11 (1011₂)) | 
结果 | |
|---|---|---|---|---|---|
& | 
按位与 (AND) | 对应位都为 1 才为 1 | a & b = 0010₂ | 
2 | |
| | 
按位或 (OR) | 对应位至少一个为 1 就为 1 | `a | b = 1111₂` | 15 | 
^ | 
按位异或 (XOR) | 对应位相同为 0,不同为 1 | a ^ b = 1101₂ | 
13 | |
~ | 
按位取反 (NOT) | 0 变 1,1 变 0 | ~a = ...11111001₂ | 
-7(补码表示) | |
<< | 
左移 | 所有二进制位向左移,右边补 0 | a << 1 = 1100₂ | 
12 | |
>> | 
右移 | 所有二进制位向右移,左边补符号位(算术右移)或 0(逻辑右移,C++ 对有符号数实现依赖编译器) | a >> 1 = 0011₂ | 
3 | 
📘 详细解释
1. 按位与 &
常用来 取某些位:
int x = 13;        // 1101₂
int mask = 4;      // 0100₂
if (x & mask) cout << "第3位是1" << endl; // 输出 第3位是1
2. 按位或 |
常用来 设置某些位为 1:
int x = 5;         // 0101₂
int mask = 2;      // 0010₂
x = x | mask;      // 0111₂ -> 7
3. 按位异或 ^
- 不同为 1,相同为 0。
 - 特性:
a ^ a = 0,a ^ 0 = a。 - 常用于 交换变量 或 求对称差。
 
int a = 5, b = 9;
a = a ^ b;
b = a ^ b;
a = a ^ b;
cout << a << " " << b << endl; // 输出 9 5
4. 按位取反 ~
逐位取反。注意负数结果与补码有关:
int a = 6; // 0000...0110
cout << ~a << endl; // -7
5. 左移 <<
相当于乘以 $2^n$(但可能溢出):
int a = 3;  // 0011₂
cout << (a << 2) << endl; // 1100₂ = 12
6. 右移 >>
相当于整除 $2^n$(但要区分有符号/无符号):
int a = 12; // 1100₂
cout << (a >> 2) << endl; // 0011₂ = 3
⚡ 补充:常见用途
- 快速运算:
x << 1相当于x * 2,x >> 1相当于x / 2。 - 掩码操作:取某些位、清零某些位、设置某些位。
 - 集合表示:一个整数的二进制位可以看作集合的元素是否存在。
 - 加密/压缩:异或在流密码、校验和算法里很常见。
 
✅ 总结
- C++ 提供了 
& | ^ ~ << >>六个主要位运算符。 - 它们直接操作二进制位,速度快、常用于底层优化。
 - 常见技巧:掩码操作、快速乘除、集合运算、加密。
 
要不要我帮你写一个 完整的小程序,输入两个整数,输出它们的二进制表示,以及 & | ^ ~ << >> 的运算结果?这样能直观看清效果。