This commit is contained in:
e2hang
2025-09-11 15:53:33 +08:00
parent 6839d2ea13
commit 265b8af720
7 changed files with 384 additions and 0 deletions

View File

@@ -0,0 +1,100 @@
好嘞 👍 你问到的 **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 变 11 变 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++ 提供了 `& | ^ ~ << >>` 六个主要位运算符。
* 它们直接操作二进制位,速度快、常用于底层优化。
* 常见技巧:掩码操作、快速乘除、集合运算、加密。
---
要不要我帮你写一个 **完整的小程序**,输入两个整数,输出它们的二进制表示,以及 `& | ^ ~ << >>` 的运算结果?这样能直观看清效果。