死因:太难记


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. ~(按位取反)
  2. << >>(移位)
  3. &(按位与)
  4. ^(按位异或)
  5. |(按位或)

建议:复杂表达式使用括号明确优先级。


典型技巧速查表

操作 表达式
置 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

位运算优先级

优先级 运算符 说明
最高 ~ 按位取反(单目运算符)
<< >> 左移、右移
& 按位与
^ 按位异或
最低 | 按位或

取反 > 移位 > 与 > 异或 > 或

So,你记下来了吗?