Files
Data-Structure/std-Cpp/BitWiseOperation/readme.md
e2hang 265b8af720 IDS
2025-09-11 15:53:33 +08:00

101 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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