分類: 程式設計

如何在程式中不使用暫存變數交換兩個變數(適用於 Java 與 C/C++ 等語言)

這裡說明如何在程式中不使用暫存變數(temporary variable)交換兩個變數,這個問題也是面試時常問的問題。

在 C/C++ 與 Java 等程式中,如果要將兩個變數所儲存的值交換,最簡單的方式就是使用一個暫存變數,例如若要將 ab 兩個變數交換,則可使用:

tmp = a
a = b
b = tmp

其中 tmp 就是一個暫存變數,而這樣的方式也是最簡單、最直覺會想到的方法。但這裡會多使用到一個暫存變數,是否有辦法不要使用額外的 tmp 變數,就將 ab 交換呢?這個問題是許多程式設計面試時會問到的問題,以下有三種解決方法。


第一種方式是使用 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

G. T. Wang

個人使用 Linux 經驗長達十餘年,樂於分享各種自由軟體技術與實作文章。

Share
Published by
G. T. Wang

Recent Posts

光陽 KYMCO GP 125 機車接電發動、更換電瓶記錄

本篇記錄我的光陽 KYMCO ...

1 年 ago

[開箱] YubiKey 5C NFC 實體金鑰

本篇是 YubiKey 5C ...

2 年 ago

[DIY] 自製竹火把

本篇記錄我拿竹子加上過期的苦茶...

2 年 ago