這裡說明如何在程式中不使用暫存變數(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