位运算 - 异或
Posted 於清樂的碎碎念
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位运算 - 异或相关的知识,希望对你有一定的参考价值。
用与或非来表示异或
通俗的说异或,即指两值相异时,取真值,否则为假。
以下是其真值表
| 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 中的任一个数,就能计算出 另一个。
以上是关于位运算 - 异或的主要内容,如果未能解决你的问题,请参考以下文章
Java位运算:位异或运算位与运算位或运算位取反运算左位移运算右位移运算无符号右移运算不用额外变量交换两个整数的值(使用位异或运算)