1. 程式人生 > >為什麽三次異或操作可以交換兩個數

為什麽三次異或操作可以交換兩個數

找到 原來 們的 異或操作 去掉 進制 ont 交換兩個數 一位

a和b是兩個整數,經過以下三次異或操作,可以達到交換目的:
a = a ^ b;
b = a ^ b;
a = a ^ b; 首先要理解,什麽是^(異或)操作:
  二進制兩數運算結果:
  0 ^ 0 = 0
  0 ^ 1 = 1
  1 ^ 0 = 1
  1 ^ 1 = 0
相同為0,不同為1 假設:
a = 10 , 其二進制數為: 1010
b = 12 , 其二進制數為: 1100
如果a和b交換,在二進制數看來,因為第一位和最後一位數相同,所以中間兩位數只要交換一下就行了
這個交換的過程,因為二制進中只有兩個數值(0和1),所以實際上只是0變1,1變0
所以總結出來就是,交換兩個數,就是它們的二進制數不一樣的位數,只要各自取反(0變1,1變0)就行了
如果兩個數轉換為二進制數的位數不一樣,只要短的那個前面補0即可。
第一次  a = a ^ b

其結果a的值為: 0110,去掉前面的0,即110,仔細觀察,此時的a其實是一個差異值(位數上的值是1的表示有差異),它找到了原來a和b的二進制數不相同的位數,1表示不相同,0表示相同
110表示,原來a和b在二進制裏中間兩位數是不一樣的,這樣就找到了在二進制中哪些位數是a和b不相同的。 第二次  b = a ^ b
此時a是一個差異值,b還是原來的數,它是如何變成a的原值呢
異或運算可以從另一個角度去理解:
當左邊的數為0時,其結果就和右邊的數一樣
當左邊的數為1時,其結果就和右邊的數取反
所以此時的a ^ b就是:
左邊的a,如果位數為0,表示原值a和b的這個位數是一樣的,那麽b的這個位數就不需要改
左邊的a,如果位數為1,表示原值a和b的這個位數是不一樣的,那麽b的這個位數就需要取反
所以b原來的值1100,前後兩位數不變,中間兩位數取反,其結果就是1010,這就符合上面交換兩個數的結論。 第三次  a = a ^ b
此時a還是差異值110,b已經變成原來a的值了,那麽a ^ b還是像上面那樣,對於b(現在已經是原來a的值),相同的位數不變,不同的位數取反,其結果就是原來b的值。 簡單結論: 異或操作找出二進制數不相同的位數,然後各自取反

為什麽三次異或操作可以交換兩個數