乍看到這個問題覺得挺簡單,但是看到需要考慮溢出就不知從何下手
後來看到一解法,覺得很有趣:
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)
這樣就能看清楚爲什麼這樣做能交換兩數數值了吧