看板 C_and_CPP 關於我們 聯絡資訊
原文恕刪。 一開始只是述敘一點面試的過程,真的沒想到在 swap 打轉了一下, 下面是回應及補充 xor swap 的東西。 ※ 引述《cuteclare (清兒)》之銘言: : void swapChars(char * a,char * b) { : (* a) ^= (* b); : (* b) ^= (* a); : (* a) ^= (* b); : }
changyuheng:XOR swap 是對純數作運算,請問為什麼負數會爆炸?10/25 12:14
loveme00835:char 有可能是有號數, 看編譯器怎麼實作10/25 12:18
changyuheng:請問如果 char 是有號數會發生什麼事?10/25 12:48
loveme00835:有請找文達人 愛迪生~10/25 12:52
changyuheng:在 2's complement 應該沒有問題吧?10/25 13:43
C++ Primer 5.3 裡面的 caution 提到,「語言」沒有保證怎麼處理 sign bit, 故建議進行 bitwise 時以 unsigned 運算。 然後又提到,若為 signed,右移時其實是可以插入 sign-bit , 或其值為 0 之 bits,取決於編譯器作法。 從書上語意看來,應該和 compiler 相依性較大。 條款 ISO/IEC 9899:TC3 6.5-4 Some operators (the unary operator ~, and the binary operators <<, >>, &, ^, and |, collectively described as bitwise operators) are required to have operands that have integer type. These operators yield values that depend on the internal representations of integers, and have implementation-defined and undefined aspects for signed types. 根據條款,它沒保證 signed 到底會怎麼處理, 但確實一般所有 bit-wise 作法都是假設 sign-bit 為 0 是安全的。 About Swap 其實面試當時要求用 bit-wise 寫 swap 時是有馬上提出「不建議改這樣」的理由 一個是可攜性問題沒錯,另一個原因是,「在某些情況下,assigned 還比較快!」。 我知道白算盤有講這招,我知道學校老師有講這招, 我知道網路上也有份數據講說「用 xor 做 swap 會為原本方法之 150 % (大概)」。 但我真的沒看到有人把編譯參數放出來、分析 asm code、做 wall time 分析, 完全沒有。當然我相信那篇寫 xor 快上 150% 是真的, 或許在 debug-mode 是這樣,或許以前 compiler Opt. 沒那麼強, 但我日前(大概二、三年前吧) 在 vc2008 , wall time 上的測試是沒比較快, 當然我也沒再看 asm 分析就是。 我們很不客觀的,拿這份 code 給 compiler 去跑, http://codepad.org/H1UyenXH vc2012 , debug-mode (TIMES 設 210000000) 預設參數,跑出來結果如下 xor td = 1546 assigned td = 614 結果是用 xor 反而慢 2.5 倍。 vc2012 , release-mode (TIMES 設 21 億) 預設參數,跑出來結果如下 xor td = 2230 assigned td = 1465 結果還是直接 assigned 較快。當然可以說我的 wall time 分析不準, 有興趣的人可以再從編出來的 asm 出來分析。 至於 gcc 4.6.1,剛我跑結果其實是差不多的 (不論有沒有下 -o2), 數據就不附上了。 所以我從二、三年前, 用 xor 做 swap 的做法觀感就變了, 可能寫單晶片用 xor 還是較快,但在寫 application 時, 個人認為大概只剩炫技成份居多, 殊不知寫成這些 code 的是真的有為它做過效能分析嗎? < 提外話,補個澄清文 : http://ppt.cc/x~uv , 小弟暫時不需生髮產品 > -- 「自從我學了 C# , 人都變聰明 , 考試都考一百分」 「自從我學了 VB , 皮膚都變好 , 人也變漂亮了 」 「自從我學了 Java , 明顯變壯 , 個子也變高了 」 「自從我學了 C++ , 內分泌失調 , 頭都禿了... 」 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.76.161
BlazarArc:生髮產品XDDDDDDDD 10/25 15:32
EdisonX:真的超多人覺得我頭很亮.. 10/25 15:33
loveme00835:原來是正姊 10/25 16:13
james732:推生髮水 10/25 16:49
cuteclare:推正姊! 10/25 16:57
firejox:推正姊! 10/25 21:41
EdisonX:@@ 愛迪生十世是男的,正姊是 Jeanette Lee, 我只是鳥仔屎. 10/25 21:49
cuteclare:阿勒~仔細一看原來是在吐朝我~不過一開始腦袋都是正姊 10/25 21:54
cuteclare:so 沒注意到 XD~ 10/25 21:54
cuteclare:不過原po說的沒錯~這是以炫耀居多orz 10/25 22:00
EdisonX:不敢不敢, 只是版主出牌 : 愛迪生的召喚,一點意見而已. 10/25 22:00
niwat:果然是Jeanette Lee, 所以愛迪生愛打花式撞球? 10/25 23:55
loveme00835:xD 10/26 01:16
EdisonX:(愛迪生連球桿都沒拿過 @@) 10/26 01:49
Ebergies:直接 assign 的確比較快, 在近代的機器都是這樣了 10/26 11:49