异或

常用运算符:

  • C/C++: ^ / xor
  • Python: ^

真值表

结果
000
110
011
101

性质1:0是异或的单位元

即,0 ^ a = a,满足交换律

性质2:任何数异或自己等于0

即,a ^ a = 0

性质3:异或同一个数两次等于啥也没做

即,a ^ b ^ b = a. 因为满足结合律,且根据性质2,b ^ b = 0,再根据性质1,a ^ 0 = a.

与

真值表

结果
000
111
010
100

基本性质

  1. 交换律:a & b = b & a
  2. 结合律:(a & b) & c = a & (b & c)
  3. 分配律(对或):a & (b | c) = (a & b) | (a & c)
  4. 吸收律:a & (a | b) = a
  5. 幂等性:a & a = a
  6. 单位元是二进制全为 1 的元素:a & ~0 = a(~0 就是二进制全为 1 的元素)
  7. 零元为 0,即任意数和 0 按位与,都得 0:a & 0 = 0
  8. 恒等式:a & ~a = 0

性质一:单调性

重要单调性:a & b 的结果中,为 1 的位一定是 a 和 b 中同时为 1 的位。因此:

(a & b) <= a         // 数值上不一定,但"1 的位数"一定不超过 a 和 b
(a & b) <= min(a, b) // 对无符号数成立
a & b  ⊆  a          // 位集合意义下,结果位是 a、b 位的交集

注:仅考虑无符号数。

性质二:德摩根定律(按位版)

~(a & b) == ~a | ~b
~(a | b) == ~a & ~b

应用一:作为掩码

按位与的核心用途是筛选/保留某些位:

a & 0x0F        // 只保留低 4 位,其余清零
a & (1 << k)    // 只保留第 k 位(结果为 0 或 2^k)
a & ~(1 << k)   // 清除第 k 位,其余不变
a & mask        // 结果 <= min(a, mask) 的位模式,只能"减少" 1 的位

判断奇偶:

a & 1   // == 0 表示偶数,== 1 表示奇数(只看最低位)

判断是否为 2 的幂:

// 原理:n 与 n-1 按位与,会把最低的 1 位及其以下全部清零。
(n & (n - 1)) == 0   // 等价于 n 是 2 的幂,n > 0 成立

应用二:组合应用

a & b == (a + b - (a ^ b)) / 2   // 一个常用恒等式
a + b == (a & b) + (a | b)       // 也是经典恒等式:两数相加
a ^ b == (a | b) - (a & b)

常见坑

a & b == c       // 被解析成 a & (b == c)  ❌
(a & b) == c     // ✅ 永远加括号

附录

C++位运算符别名

替代记号等价运算符1 和 2 的结果
and&& 逻辑与1 (true)
or| 逻辑或1 (true)
not! 逻辑非—
** xor **^ 按位异或3
bitand& 按位与0
bitor| 按位或3
compl~ 按位取反—

see also: 神奇的位运算