位运算 - 异或
用与或非来表示异或
通俗的说异或,即指两值相异时,取真值,否则为假。
以下是其真值表
x^y | (y) 0 | 1 |
---|---|---|
(x)0 | 0 | 1 |
1 | 1 | 0 |
那么如何用与或非实现呢?
既然是相异,当然首先想到 x & ~y,看看它的真值表
x & ~y | 0 | 1 |
---|---|---|
0 | 0 | 0 |
1 | 1 | 0 |
有一个位子有点不一样,如果换一下 x 和 y 的位置呢?
y & ~x | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 0 | 0 |
哦,这下很清楚了两个表叠加一下,就是异或了。所以 x^y,用与或非表示,是 (x & ~y) & (y & ~x).
特征
- a ^ a = 0
- a ^ ~a = 1
- a ^ b = b ^ a
从上面三个特征,可以得到很多有趣的东西。
一个经典的例子是,用异或实现不用额外空间的数据交换:
a = a^b;
b = a^b; // = a^b^b = a^0 = a
a = a^b; // = a^b^a = b^a^a = b^0 = b
只要知道 a^b 和 a, b 中的任一个数,就能计算出 另一个。