码迷,mamicode.com
首页 > 其他好文 > 详细

位运算 - 异或

时间:2018-04-11 15:07:26      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:有趣的   经典   例子   一个   有趣   code   有一个   特征   空间   

用与或非来表示异或

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

以下是其真值表
| 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 中的任一个数,就能计算出 另一个。

位运算 - 异或

标签:有趣的   经典   例子   一个   有趣   code   有一个   特征   空间   

原文地址:https://www.cnblogs.com/kirito-c/p/8794762.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!