這裡說明如何在程式中不使用暫存變數(temporary variable)交換兩個變數,這個問題也是面試時常問的問題。
在 C/C++ 與 Java 等程式中,如果要將兩個變數所儲存的值交換,最簡單的方式就是使用一個暫存變數,例如若要將 a 與 b 兩個變數交換,則可使用:
tmp = a
a = b
b = tmp其中 tmp 就是一個暫存變數,而這樣的方式也是最簡單、最直覺會想到的方法。但這裡會多使用到一個暫存變數,是否有辦法不要使用額外的 tmp 變數,就將 a 與 b 交換呢?這個問題是許多程式設計面試時會問到的問題,以下有三種解決方法。
第一種方式是使用 XOR 運算:
a = a ^ b
b = a ^ b
a = a ^ b
第二種是使用加法與減法:
a = a + b
b = a - b
a = a - b
第三種是使用乘法與除法:
a = a * b
b = a / b
a = a / b
這三種方式作用都相同,但是第二種與第三種都可能會有溢位(overflow)的問題,所以最佳的解法是使用第一種 XOR 運算。
使用 XOR 運算的方式來交換兩個變數,直接從表面上看不是很好理解,我們可以使用一些簡單的數學運算來解釋,為了避免變數混淆,首先將 XOR 的三條運算改寫為:
x = a ^ b
y = x ^ b
z = x ^ y然後透過簡單的數學代數運算,我們可以得到 y 的值為
y = (a ^ b) ^ b = a ^ b ^ b = a ^ (b ^ b) = a ^ 0 = a而 z 的值為
z = (a ^ b) ^ a = a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b這樣就比較清楚了。
參考資料:Javarevisited
訂閱:
張貼留言 (Atom)
Nice explanation with example.
回覆刪除Thanks,
https://www.flowerbrackets.com/java-program-to-swap-two-numbers/
Nice article . There is good coding example collection visit
回覆刪除Top coding program example