异或运算(^、xor)

在编程中,想要交换A、B两个值,一般的做法都是开辟一个额外空间来存放A的值,将B的值放到A中,再将存放在额外空间中的值放到B中,这样完成一次A和B的交换。
那么为啥不直接将A的值放到B中,再将B的值放到A中呢?因为这样在第一次A的值放到B中,B的值已经被覆盖,此时B的值也变成A所存放的值了,所以最后的结果就是A和B中都是存放的A的值,B原先的值丢失了。
那么有没有方法不开辟额外的内存空间来完成一次交换呢?答案是可以的,使用异或运算,即下面这样,三行代码就可以完成:

a = a ^ b
b = a ^ b
a = a ^ b

这三行代码发生了什么事,既然能在不开辟额外空间的条件下完成a和b的互换?在这之前,先要明白异或运算的定义和它的一些特性:

异或运算:异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1)
特性1:0和任何数做异或运算都等于这个数本身,即0^N=N。
特性2:异或运算满足乘法和加法中的交换律,即a^b^c和c^b^a的结果是一样的。
特性3:一个运算式子中,偶数个相同数异或结果为0,奇数个相同数异或结果是这个数本身,即a^a^a^a=0,a^a^a=a。

搞清楚了异或运算的概念和一些特性后,回过头来看上面三行代码发生的过程:
第一行:a做了赋值运算,发生了改变,此时a记为a^b,b的值不变还是b;
第二行:a在第一行之后变为a^b, b做了赋值运算,此时b的值为a^b ^b,结合上面特性,此时b最终的结果为a;
第三行:b在第二行之后变成了a,a做赋值运算,此时a的值为a^b ^a,结合上面特性,a最终的运算结果为b。
以上就是三行代码发生的全过程,使用异或运算在不开辟额外空间的情况下就能交换两个值。

你可能感兴趣的:(异或运算(^、xor))