- gf25051 的博客
《咸鱼概要 · C++》位运算
- @ 2026-5-4 10:59:19
死因:太难记
C++ 提供了 6 种位运算符,专门用于对整数类型的二进制位进行操作。下面是完整的大全,包括符号、名称、规则、示例和常见用途。
1. 位运算符总览
| 运算符 | 名称 | 示例 | 说明 |
|---|---|---|---|
& |
按位与 | a & b |
对应位都为 1 时结果为 1 |
| |
按位或 | a | b |
对应位有一个为 1 时结果为 1 |
^ |
按位异或 | a ^ b |
对应位相同时为 0,不同时为 1 |
~ |
按位取反 | ~a |
每一位 0 变 1,1 变 0 |
<< |
左移 | a << n |
左移 n 位,右边补 0 |
>> |
右移 | a >> n |
右移 n 位(无符号补 0,有符号取决于实现) |
1. 按位与(&)
规则:对应位都为 1 时结果为 1,否则为 0
| a | b | a & b |
|---|---|---|
| 0 | 0 | 0 |
| 1 | ||
| 1 | 0 | |
| 1 | ||
int a = 6; // 0110
int b = 3; // 0011
int c = a & b; // 0010 = 2
用途:
- 清零特定位(
x & 0) - 取出某一位(
x & (1 << k)判断第 k 位是否为 1) - 判断奇偶(
x & 1为 1 则奇数)
2. 按位或(|)
规则:对应位有一个为 1 则结果为 1
| a | b | a | b |
|---|---|---|
| 0 | 0 | |
| 1 | 1 | |
| 1 | 0 | |
| 1 | ||
int c = 6 | 3; // 0111 = 7
用途:
- 将特定位设为 1(
x | (1 << k)) - 组合多个标志位
3. 按位异或(^)
规则:相同为 0,相异为 1
| a | b | a ^ b |
|---|---|---|
| 0 | 0 | |
| 1 | 1 | |
| 1 | 0 | |
| 1 | 0 | |
int c = 6 ^ 3; // 0101 = 5
用途:
- 交换两数(
a ^= b; b ^= a; a ^= b;) - 判断两数是否相等(
(a ^ b) == 0) - 简单加密/解密(相同密钥异或两次恢复原值)
4. 左移(<<)
规则:将二进制位全部左移 n 位,右边补 0
int a = 5; // 0101
int b = a << 1; // 1010 = 10
int c = a << 2; // 10100 = 20
注意:
- 等价于
a * 2^n(可能溢出) - 左移负数或超出范围是未定义行为
用途:
- 快速乘以 2 的幂
- 构造位掩码(
1 << k)
5. 右移(>>)
规则:将二进制位全部右移 n 位
- 无符号数:左边补 0(逻辑右移)
- 有符号正数:左边补 0
- 有符号负数:左边补 1(算术右移,具体看编译器,但标准规定是实现定义)
unsigned int u = 8; // 1000
u = u >> 1; // 0100 = 4
int x = -8; // 通常补码 1111...1000
int y = x >> 1; // 结果依赖实现,常见是 -4
用途:
- 快速除以 2 的幂(向下取整)
- 提取位段
6. 按位取反(~)
规则:单目运算符,将每一位 0 变 1,1 变 0
unsigned char a = 0b00001111; // 15
unsigned char b = ~a; // 0b11110000 = 240
注意:对 int 使用会包括符号位,结果类型保持不变。
用途:
- 构造反掩码
- 清除某几位与按位与配合:
x & ~mask
组合优先级(从高到低,部分相关运算符)
~(按位取反)<<>>(移位)&(按位与)^(按位异或)|(按位或)
建议:复杂表达式使用括号明确优先级。
典型技巧速查表
| 操作 | 表达式 |
|---|---|
| 置 1(第 k 位) | x |= (1 << k) |
| 置 0(第 k 位) | x &= ~(1 << k) |
| 取第 k 位 | (x >> k) & 1 |
| 翻转第 k 位 | x ^= (1 << k) |
| 低 n 位全 1 | (1 << n) - 1 |
| 判断 2 的幂(>0) | (x & (x - 1)) == 0 |
| 去掉最低位的 1 | x & (x - 1) |
| 取出最低位的 1 | x & -x |
位运算优先级
| 优先级 | 运算符 | 说明 |
|---|---|---|
| 最高 | ~ |
按位取反(单目运算符) |
| ↓ | << >> |
左移、右移 |
& |
按位与 | |
^ |
按位异或 | |
| 最低 | | |
按位或 |
取反 > 移位 > 与 > 异或 > 或