交換兩數,不使用第三變量,且考慮溢出問題

乍看到這個問題覺得挺簡單,但是看到需要考慮溢出就不知從何下手

後來看到一解法,覺得很有趣:

 

void swap(int &x, int &y)
{
    x = x ^ y;
    y = x ^ y;
    x = x ^ y;
}
一開始覺得奇怪,爲什麼會這樣,後來隨便拿了兩個數字驗證了一下,結果果然是這樣

 

x:    000110101
y:    011010111
x=x^y:    011100010
y=x^y:    000110101
x=x^y:    011010111
那爲什麼會這樣呢?考慮過之後我用真值表對這種算法進行了一下驗證

p q p ^ q ^ q
T T T
T F T
F T F
F F F

 

 

 

 

可以看到 p≡p^q^q (也可以寫做q^p^q)

p q p ^ q ^ p
T T T
T F F
F T T
F F F

 

 

 

 

可以看到 q≡p^q^p(也可以寫做q^p^p)

再拿前面的算法步驟套用這公式

x=x^y
y=x^y(x^y^y=x)
x=x^y(x^y^x=y)

這樣就能看清楚爲什麼這樣做能交換兩數數值了吧

發佈了53 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章