IDS
This commit is contained in:
100
std-Cpp/BitWiseOperation/readme.md
Normal file
100
std-Cpp/BitWiseOperation/readme.md
Normal 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 变 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++ 提供了 `& | ^ ~ << >>` 六个主要位运算符。
|
||||
* 它们直接操作二进制位,速度快、常用于底层优化。
|
||||
* 常见技巧:掩码操作、快速乘除、集合运算、加密。
|
||||
|
||||
---
|
||||
|
||||
要不要我帮你写一个 **完整的小程序**,输入两个整数,输出它们的二进制表示,以及 `& | ^ ~ << >>` 的运算结果?这样能直观看清效果。
|
||||
Reference in New Issue
Block a user