[問題] XOR交換值問題

看板C_and_CPP作者 (濕濕)時間6年前 (2017/11/23 11:10), 編輯推噓8(8029)
留言37則, 11人參與, 6年前最新討論串1/3 (看更多)
語言:CPP 今天寫quick sort的時候發現原本常用的交數值方法好像有觀念上的問題 https://i.imgur.com/GwH4NbM.png
我習慣的用法是第二十七行 直接用參考交換兩個值 但是發現印出來後都是一堆0 後來交叉比對後發現是XOR交換值的問題 想請問一下是不是陣列用XOR交換數值會出錯? 想請問一下原因 麻煩各位大大了 -- Talk is cheap. Show me the code. - Torvalds, Linus (2000-08-25). -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 163.22.18.105 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1511406650.A.CFC.html

11/23 11:42, 6年前 , 1F
One registeris is cheap.
11/23 11:42, 1F

11/23 11:43, 6年前 , 2F
認真回 那個你這個寫法啊 是 UB 喔
11/23 11:43, 2F

11/23 11:44, 6年前 , 3F
不能在同一個 SP 區間賦值兩次
11/23 11:44, 3F

11/23 11:44, 6年前 , 4F
請問UB是什麼意思
11/23 11:44, 4F

11/23 11:45, 6年前 , 5F
Undefined Behavior
11/23 11:45, 5F

11/23 11:46, 6年前 , 6F
原來如此 我之前都這樣做 然後沒出錯 我以為可以這樣子
11/23 11:46, 6F

11/23 11:46, 6年前 , 7F
簡單說 要把異或賦值拆成三行寫才行
11/23 11:46, 7F

11/23 11:49, 6年前 , 8F
這是原本寫法的記憶體
11/23 11:49, 8F

11/23 11:49, 6年前 , 9F
貼上來給大家參考 不要踩雷了
11/23 11:49, 9F

11/23 11:58, 6年前 , 10F
原本寫法的沒差啊!?a跟b的值對調了不是嗎
11/23 11:58, 10F

11/23 12:05, 6年前 , 11F
我也不清楚 求解答@@
11/23 12:05, 11F

11/23 12:11, 6年前 , 12F
我原本的寫法交換完 記憶體不是對調 是不一樣 如圖
11/23 12:11, 12F

11/23 12:12, 6年前 , 13F
然後在main裡面記憶體少一個bit是因為0省略掉了?
11/23 12:12, 13F

11/23 12:12, 6年前 , 14F
要不要改成非陣列的寫法觀察看看,假設a,b,c,d之類
11/23 12:12, 14F

11/23 12:13, 6年前 , 15F
而且樓主30行是不是怪怪的
11/23 12:13, 15F

11/23 12:16, 6年前 , 16F
就算拆成三行,a=b 時會讓 a,b 都變成0
11/23 12:16, 16F

11/23 12:24, 6年前 , 17F
30行原本是SWAP 會印出一堆0 資料裡沒有0
11/23 12:24, 17F

11/23 12:29, 6年前 , 18F
你推文那張圖是少了空白吧 位址明明一樣
11/23 12:29, 18F

11/23 12:56, 6年前 , 19F
xor swap 會 zero out 很明顯就是你x y 都是同一個「空間」
11/23 12:56, 19F

11/23 13:01, 6年前 , 20F
a b
11/23 13:01, 20F

11/23 13:10, 6年前 , 21F
warning: operation on 'a' may be undefined [-Wsequen
11/23 13:10, 21F

11/23 13:11, 6年前 , 22F
ce-point]
11/23 13:11, 22F

11/23 13:53, 6年前 , 23F
用mingw的c++幫你試,這樣換的過來~ 4.9.2 32bit環境
11/23 13:53, 23F

11/23 14:30, 6年前 , 24F
就你i j index一樣會zero out,加個判斷式index一樣不用swa
11/23 14:30, 24F

11/23 14:30, 6年前 , 25F
p…
11/23 14:30, 25F

11/23 14:42, 6年前 , 26F
請問一下zero out是什麼意思
11/23 14:42, 26F

11/23 14:45, 6年前 , 27F
index一樣會跑出零 謝謝大大解答 請問我要如何搜尋這方面
11/23 14:45, 27F

11/23 14:45, 6年前 , 28F
的知識
11/23 14:45, 28F

11/23 15:12, 6年前 , 29F
q
11/23 15:12, 29F

11/23 15:55, 6年前 , 30F
zero out就是被清成0啦 XD
11/23 15:55, 30F

11/23 16:02, 6年前 , 31F
xor自己XD 我晚惹~
11/23 16:02, 31F

11/23 17:05, 6年前 , 32F
雖然晚了, 我的 #1Deo3lyi 這篇也可參考一下
11/23 17:05, 32F

11/23 17:06, 6年前 , 33F
然後如上面所說, 即使寫三條碰到 a b 同位置也會出事
11/23 17:06, 33F

11/24 19:12, 6年前 , 34F
你自己都看不懂了...
11/24 19:12, 34F

11/24 19:12, 6年前 , 35F
為何要寫一些要動腦的coding style?
11/24 19:12, 35F

11/24 19:12, 6年前 , 36F
compiler會最佳化..別害同事
11/24 19:12, 36F

11/25 02:48, 6年前 , 37F
效能瓶頸地方通常不是這個 swap…
11/25 02:48, 37F
文章代碼(AID): #1Q5Zmwpy (C_and_CPP)
文章代碼(AID): #1Q5Zmwpy (C_and_CPP)