雜~~瓦魯多~~筆記
交換兩變數值的swap方法百百種,其中還有很精神污染的XOR大法,嘎油。
如果是很直覺的打出這東西,那你就掉到陷阱裡ㄌ:
在第3行的 x=y
執行後, x
的值會變為2,但 y
的值也還是2,這就讓兩個都變為原本 y
的值2了。
所以正確做法應該是要再開一個變數,來儲存原本x的值:
c++有內建swap函式,可以直接交換兩變數值。
在這裡要先來講講XOR(exclusive or)是啥。
XOR在c++裡的運算符號是 ^
,運算關係可以用以下方式呈現:
0 | 1 | |
---|---|---|
0 | 0 | 1 |
1 | 1 | 0 |
而依此規則,兩數XOR的運算如下例:
設x=188,y=85
先將兩者轉為二進位,x=10111100,y=01010101
x | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 |
---|---|---|---|---|---|---|---|---|
y | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 |
x^y | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 |
可得到 x^y
的值為11100110。
那如果再把 x^y
的值再 ^y
一次…
x^y | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
y | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 |
1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 |
可以看到值變回 x
了。
如果 x\^y
再 ^x
則是…
x^y | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
x | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 |
1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 |
可由以上範例,觀察出 XOR 會有以下關係:
只要對同個數 XOR 兩次,就會變回原本的數字
所以!神奇的事要來ㄌ!
輸出如下:
第一次看到XOR這招的我大概就是 wait wut 這種感覺。
總之是個很妙的方法,巧妙運用了XOR的還原特性。