位运算初步

位运算是指在二进制位的层面上直接对整数进行操作的运算。

  • 数据在计算机中以二进制(0/1)存储
  • 位运算比算术运算(+、-、*、/)快得多
  • 常用于:权限控制、状态压缩、加密、图形处理、底层优化

1. 位运算符概念

C++ 中的 6 个基本位运算符:

运算符名称英文说明
&按位与AND两位都为1 → 结果为1
|按位或OR至少一位为1 → 结果为1
^按位异或XOR两位不同 → 结果为1
~按位取反NOT0变1,1变0
<<左移SHL所有位向左移动,右侧补0
>>右移SHR所有位向右移动,左侧补符号位

注意:位运算符只能用于 intlongshortchar整数类型


2. 位与(&)

规则表

ABA & B
000
010
100
111

常见用途

  • 判断奇偶:if (x & 1) → 奇数
  • 取特定位:x & (1 << k) → 判断第k位是否为1

3. 位或(|)

规则表

ABA | B
000
011
101
111

常见用途

  • 设置特定位为1:x | (1 << k)
  • 权限合并:READ | WRITE | EXECUTE

4. 位异或(^)

规则表

ABA ^ B
000
011
101
110

重要性质

  • a ^ a = 0(自己异或自己得0)
  • a ^ 0 = a(与0异或不变)
  • a ^ b ^ b = a(两次异或还原)

常见用途

  • 翻转特定位:x ^ (1 << k)
  • 交换两数(不用临时变量)
  • 找出出现奇数次的数

5. 位非(~)

规则

  • 0 变 1
  • 1 变 0
  • 包括符号位也会取反

重要公式

 ~x = -x - 1

常见用途

  • 清除特定位:x & ~(1 << k)
  • 获取全1掩码:~0

6. 左移(<<)

规则

  • 所有位向左移动
  • 右侧补 0
  • 左侧超出的位被丢弃

数学意义

 a << n = a × 2ⁿ

常见用途

  • 快速乘以2的幂
  • 构造掩码:(1 << k) 表示第k位为1

7. 右移(>>)

规则

  • 所有位向右移动
  • 左侧补符号位(正数补0,负数补1)
  • 右侧超出的位被丢弃

数学意义

 a >> n = ⌊a / 2ⁿ⌋  (向负无穷取整)

常见用途

  • 快速除以2的幂
  • 取高位数据
  • 树状数组中的 lowbit 操作

8. 所有运算符速查表

运算示例结果说明
5 & 310101 & 0011 = 0001
5 | 370101 | 0011 = 0111
异或5 ^ 360101 ^ 0011 = 0110
取反~5-6~x = -x-1
左移5 << 110×2
右移20 >> 110÷2

9. 优先级提醒(重要!)

位运算符优先级低于判等运算符

 // 错误
 if (x & 1 == 0)   // 实际是 x & (1==0) → x & 0
 ​
 // 正确
 if ((x & 1) == 0)

口诀:位运算一律加括号,安全第一不出错。