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