C 語言:一行代碼實現變量值交換的原理
[編輯] [转简体] (简体译文)
|
作者:huidong
| 分類:【編程】C/C++
[
18 瀏覽
0 評論
4 贊
4 踩
]
概要
a^=b^=a^=b;
正文
要理解這個交換方法,首先需要理解異或運算的意義,首先來看異或的真值表:
A B A xor B
0 0 0
0 1 1
1 0 1
1 1 0
所以,異或可以有兩種解讀。如果我們假設 c = a ^ b,那麼:
解讀一:c 中的每一位表示 a, b 的相應位是否不同。不同爲 1,相同爲 0。
解讀二:在 a xor b 中,對於 b 的每一位,爲 1 表示 a 的這一位需要取反,爲 0 表示保持原狀,然後將運算結果保存到 c。(a, b 的意義可以反過來)
因此,我們首先將 a^=b^=a^=b 拆分開,就是:
a^=b; // a 的意義變爲:a, b 中每一位是否不同。 b^=a; // 以這時的 a 作爲取反標準,對於每一位,如果 a 標記爲 1(即 a, b 初始值在這一位不同),就對 b 這一位取反,即變成了 a 這一位的初始值。 a^=b; // 此時的 b 已經變成了 a 的初始值,a 再與 b 異或,就可以和上面的原理一樣得到 b 了。
再把三行代碼縮爲一行,就是:
a^=b^=a^=b;