# 位运算符

URL: https://caijiao.org/cpp/basic/bitwise
Source: docs/cpp/basic/bitwise.md
Description: 本节将介绍 C++ 中的位运算符，帮助你理解如何操作整数的二进制位，并进行高效的数据处理。

位运算符用于操作整数的二进制表示，它们通常用于底层编程、加密算法或高效的数据处理。C++ 提供了一组位运算符，用于处理位级别的操作。

## 位运算符

### 1. 按位与运算符 `&`

按位与运算符比较两个操作数的每一位，只有在两个相应的位都为 `1` 时，结果才为 `1`，否则为 `0`。

```cpp
int a = 5;  // 101
int b = 3;  // 011
int result = a & b;  // 001 -> result = 1
````

### 2. 按位或运算符 `|`

按位或运算符比较两个操作数的每一位，只有在两个相应的位中至少有一个为 `1` 时，结果才为 `1`，否则为 `0`。

```cpp
int a = 5;  // 101
int b = 3;  // 011
int result = a | b;  // 111 -> result = 7
```

### 3. 按位异或运算符 `^`

按位异或运算符比较两个操作数的每一位，只有在两个相应的位不同时，结果才为 `1`，相同则为 `0`。

```cpp
int a = 5;  // 101
int b = 3;  // 011
int result = a ^ b;  // 110 -> result = 6
```

### 4. 按位取反运算符 `~`

按位取反运算符将操作数的每一位进行取反，即 `0` 变为 `1`，`1` 变为 `0`。

```cpp
int a = 5;  // 101
int result = ~a;  // 010 -> result = -6 (以补码表示)
```

### 5. 左移运算符 `<<`

左移运算符将操作数的位向左移动指定的位数。左移会将数值扩大 `2` 的移位次数次方。

```cpp
int a = 5;  // 101
int result = a << 1;  // 1010 -> result = 10
```

### 6. 右移运算符 `>>`

右移运算符将操作数的位向右移动指定的位数。右移会将数值缩小 `2` 的移位次数次方。

```cpp
int a = 5;  // 101
int result = a >> 1;  // 010 -> result = 2
```

## 位运算符应用

### 1. 交换两个整数

通过位运算符可以交换两个整数的值而不使用额外的变量：

```cpp
int a = 5, b = 3;
a = a ^ b;
b = a ^ b;
a = a ^ b;
```

### 2. 判断数字是否是偶数或奇数

通过检查一个整数的最低有效位（LSB），可以判断它是偶数还是奇数。若最低有效位为 `0`，则为偶数；否则为奇数。

```cpp
int a = 4;
if ((a & 1) == 0) {
    cout << "偶数" << endl;
} else {
    cout << "奇数" << endl;
}
```

### 3. 设置、清除和切换特定位

使用位运算符可以方便地设置、清除或切换特定的位。

* **设置特定位**：
  将特定的位设置为 `1`。

  ```cpp
  int a = 5;  // 0101
  a = a | (1 << 2);  // 设置第 3 位为 1，结果 1111
  ```

* **清除特定位**：
  将特定的位清除为 `0`。

  ```cpp
  int a = 5;  // 0101
  a = a & ~(1 << 2);  // 清除第 3 位，结果 0001
  ```

* **切换特定位**：
  切换特定的位（`1` 变 `0`，`0` 变 `1`）。

  ```cpp
  int a = 5;  // 0101
  a = a ^ (1 << 2);  // 切换第 3 位，结果 0001
  ```

## 小结

* **位运算符** 提供了高效的整数操作，广泛应用于底层编程和性能优化中。
* 常用的位运算符包括按位与、按位或、按位异或、按位取反、左移和右移。
* 位运算在处理特定位、加密算法和高效的算法设计中有着重要作用。

通过掌握这些位运算符，可以在 C++ 中进行高效的数据操作和处理。
