位运算 - 异或

用与或非来表示异或

通俗的说异或,即指两值相异时,取真值,否则为假。

以下是其真值表

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).

特征

  1. a ^ a = 0
  2. a ^ ~a = 1
  3. 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 中的任一个数,就能计算出 另一个。

posted @ 2018-04-11 12:03  於清樂  阅读(404)  评论(0编辑  收藏  举报