看板 C_and_CPP 關於我們 聯絡資訊
int a, b; a= 123; b= 456; a^= b^= a^= b; // 只要 一行指令,不需要使用第三個變數, 即可達到 目的。 請問:為什麼? ※ 引述《ballgi (環給一個幸福)》之銘言: : 不好意思,我想請教一個問題 : x=1 : y=2 : 如果不用第三個變數就能轉換彼此的數值為 : x=2 : y=1 : 我不知道可以這樣作耶,請問誰能指導我,謝謝 : 在此感謝鄉民提供的智慧 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.80.251.64
nowar100:這方法不好 有 side effect 04/11 14:21
nowar100:分三行寫吧,且我覺得可讀性大輸, 04/11 14:22
Yshuan:推樓上... 04/11 14:36
ledia:a^=(b^= (a^=b)) 最裡面那層做完, a 變成 a, b 的 bit diff 04/11 14:45
ledia:接下來 b^= (bit diff) -> 變成 a, 最後 bit_diff ^= a -> b 04/11 14:46
cismjmgoshr:a^a=0, a^b=b^a, (a^b)^c=a^(b^c), a^1=a 大概是這樣 04/11 15:22
littleshan:不要這樣寫!這是 implementation-defined behavior 04/11 15:48
littleshan:就是十誡之八啦 04/11 15:49
Ebergies:而且這個方法速度也比較慢... 04/11 15:58
TsinTa:剛剛測了一下,還真的比較慢@@" 04/11 16:18
sjgau:謝謝 大家的回覆,我大概懂了。等我有空,再來整理一下 04/11 17:15
yoco315:而且就算速度沒有比較慢,這個實作也存在一個很隱微的bugXD 04/11 18:00
yoco315:不過我也不知道這個方法比較慢耶.. 請教一下原因? 04/11 18:01
sjgau:是否有 side effect, 我會再詳細測試 04/11 18:54
sjgau:是否比較慢,我也會再 詳細測試 04/11 18:54
nowar100:side effect 不是你可以"詳細測試"出來的.... 04/11 19:10
purpose:要做三次xor,加上assignment。tmp=a; a=b; b=tmp; 做三次 04/11 19:34
purpose:assignment (mov) 就做完了 04/11 19:34
kevingwn:印象中編出來的asm反而比較長 04/11 22:06
wowtiger:因為對現行的CPU而言 xor 是要三個指令 mov 是沒有指令 04/11 22:06
laiis:如果只是交換... x=x+y; y=x-y; x=x-y; 這樣如何..? 04/11 22:15
wowtiger:跟 xor 是一樣的 除了一些有所謂 xor 特化的 CPU 之外 04/11 22:20
softwind:就講 不要這樣寫了... 你寫ASM才來考慮這問題 04/12 00:05
tropical72:我測過,實際上真的慢很多 (for vc6.0 2008 2010) 04/12 01:56
softwind:測速度 XXD 應該翻成ASM code來比 才知道哪邊有最佳化... 04/12 23:14