Re: [問題] 請教如何只用x,y兩變數來交換彼此數值

看板C_and_CPP作者 (sjgau)時間13年前 (2011/04/11 14:09), 編輯推噓9(9016)
留言25則, 15人參與, 最新討論串1/3 (看更多)
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

04/11 14:21, , 1F
這方法不好 有 side effect
04/11 14:21, 1F

04/11 14:22, , 2F
分三行寫吧,且我覺得可讀性大輸,
04/11 14:22, 2F

04/11 14:36, , 3F
推樓上...
04/11 14:36, 3F

04/11 14:45, , 4F
a^=(b^= (a^=b)) 最裡面那層做完, a 變成 a, b 的 bit diff
04/11 14:45, 4F

04/11 14:46, , 5F
接下來 b^= (bit diff) -> 變成 a, 最後 bit_diff ^= a -> b
04/11 14:46, 5F

04/11 15:22, , 6F
a^a=0, a^b=b^a, (a^b)^c=a^(b^c), a^1=a 大概是這樣
04/11 15:22, 6F

04/11 15:48, , 7F
不要這樣寫!這是 implementation-defined behavior
04/11 15:48, 7F

04/11 15:49, , 8F
就是十誡之八啦
04/11 15:49, 8F

04/11 15:58, , 9F
而且這個方法速度也比較慢...
04/11 15:58, 9F

04/11 16:18, , 10F
剛剛測了一下,還真的比較慢@@"
04/11 16:18, 10F

04/11 17:15, , 11F
謝謝 大家的回覆,我大概懂了。等我有空,再來整理一下
04/11 17:15, 11F

04/11 18:00, , 12F
而且就算速度沒有比較慢,這個實作也存在一個很隱微的bugXD
04/11 18:00, 12F

04/11 18:01, , 13F
不過我也不知道這個方法比較慢耶.. 請教一下原因?
04/11 18:01, 13F

04/11 18:54, , 14F
是否有 side effect, 我會再詳細測試
04/11 18:54, 14F

04/11 18:54, , 15F
是否比較慢,我也會再 詳細測試
04/11 18:54, 15F

04/11 19:10, , 16F
side effect 不是你可以"詳細測試"出來的....
04/11 19:10, 16F

04/11 19:34, , 17F
要做三次xor,加上assignment。tmp=a; a=b; b=tmp; 做三次
04/11 19:34, 17F

04/11 19:34, , 18F
assignment (mov) 就做完了
04/11 19:34, 18F

04/11 22:06, , 19F
印象中編出來的asm反而比較長
04/11 22:06, 19F

04/11 22:06, , 20F
因為對現行的CPU而言 xor 是要三個指令 mov 是沒有指令
04/11 22:06, 20F

04/11 22:15, , 21F
如果只是交換... x=x+y; y=x-y; x=x-y; 這樣如何..?
04/11 22:15, 21F

04/11 22:20, , 22F
跟 xor 是一樣的 除了一些有所謂 xor 特化的 CPU 之外
04/11 22:20, 22F

04/12 00:05, , 23F
就講 不要這樣寫了... 你寫ASM才來考慮這問題
04/12 00:05, 23F

04/12 01:56, , 24F
我測過,實際上真的慢很多 (for vc6.0 2008 2010)
04/12 01:56, 24F

04/12 23:14, , 25F
測速度 XXD 應該翻成ASM code來比 才知道哪邊有最佳化...
04/12 23:14, 25F
文章代碼(AID): #1DefigZb (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1DefigZb (C_and_CPP)