Try   HackMD
tags: 雜~~瓦魯多~~筆記

精神污染的swap

交換兩變數值的swap方法百百種,其中還有很精神污染的XOR大法,嘎油。

小心變數值被覆蓋!

如果是很直覺的打出這東西,那你就掉到陷阱裡ㄌ:

int x=1,y=2; x=y; y=x;

在第3行的 x=y 執行後, x 的值會變為2,但 y 的值也還是2,這就讓兩個都變為原本 y 的值2了。

所以正確做法應該是要再開一個變數,來儲存原本x的值:

int x=1,y=2; int temp; temp=x; x=y; y=temp;

swap()

c++有內建swap函式,可以直接交換兩變數值。

int x=1,y=2; swap(x,y);

XOR

在這裡要先來講講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 會有以下關係:

(x^y) ^ y = x
(x^y) ^ x = y

只要對同個數 XOR 兩次,就會變回原本的數字

所以!神奇的事要來ㄌ!

int x=1,y=2; x = x^y; //X現在為1^2 y = x^y; //y現在為(1^2)^2,也就是1 x = x^y; //x現在為(1^2)^1,也就是2 cout << "x=" << x << "\ny=" << y;

輸出如下:

x=2
y=1

第一次看到XOR這招的我大概就是

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
wait wut
Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
這種感覺。
總之是個很妙的方法,巧妙運用了XOR的還原特性。