原理:
通常的交換兩個變量a,b的過程為
int temp;
temp=a
a=b;
b=temp;
需借助上面的第3個臨時變量temp.
采用下面的方法,對於給定兩個整數a,b,下面的異或運算可以實現a,b的交換,而無需借助第3個臨時變量:
a = a ^ b;
b = a ^ b;
a = a ^ b;
這個交換兩個變量而無需借助第3個臨時變量過程,其實現主要是基於異或運算的如下性質:
1.任意一個變量X與其自身進行異或運算,結果為0,即X^X=0
2.任意一個變量X與0進行異或運算,結果不變,即X^0=X
3.異或運算具有可結合性,即a^b^c=(a^b)^c=a^(b^c)
4.異或運算具有可交換性,即a^b=b^a
分析:
第一步: a = a ^ b;
完成后 a變量的結果為a ^ b
第二步: b = a ^ b;
此時賦值號右邊的a保存的是a ^ b的值,那么將賦值號右邊的a用a ^ b替換,
得到(a ^ b) ^ b=a ^ (b ^ b)=a ^0=a,
即經過第二步運算后b中的值為a,即b=a,將a換到了b里
第三步: a = a ^ b;
此時賦值號右邊的a保存的仍然是a ^ b的值,不變,而賦值號右邊的b已經是a 了,
將賦值號右邊的a,b分別進行替換,
即此時賦值號右邊a ^ b=(a ^ b)^ a=a ^ b^ a=a ^ a^ b=0^ b=b, 該值賦值給a,即a=b
即經過第三步運算后a中的值為b,即a=b,將b換到了a里
這樣經過如上的三步驟,完成了交換兩個變量a,b而無需借助第3個臨時變量過程。
這個過程等價於如下的過程,:
a=a+b
b=a-b;
a=a-b;
前提是a+b的值不能溢出。
測試程序如下:
int main()
{
int a = 4, b = 5;
printf("a=%d b=%d\n", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a=%d b=%d\n", a, b);
}
運行結果:
[root@test cs]# ./a.out
a=4 b=5
a=5 b=4
[ 注意:當a和b相等時,該方法不適用]