Re: [問題] 反轉字串裡面的字元

看板C_and_CPP作者 (閉上眼的魚)時間13年前 (2012/10/25 15:18), 編輯推噓7(708)
留言15則, 8人參與, 最新討論串6/7 (看更多)
原文恕刪。 一開始只是述敘一點面試的過程,真的沒想到在 swap 打轉了一下, 下面是回應及補充 xor swap 的東西。 ※ 引述《cuteclare (清兒)》之銘言: : void swapChars(char * a,char * b) { : (* a) ^= (* b); : (* b) ^= (* a); : (* a) ^= (* b); : }

10/25 12:14,
XOR swap 是對純數作運算,請問為什麼負數會爆炸?
10/25 12:14

10/25 12:18,
char 有可能是有號數, 看編譯器怎麼實作
10/25 12:18

10/25 12:48,
請問如果 char 是有號數會發生什麼事?
10/25 12:48

10/25 12:52,
有請找文達人 愛迪生~
10/25 12:52

10/25 13:43,
在 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

10/25 15:32, , 1F
生髮產品XDDDDDDDD
10/25 15:32, 1F

10/25 15:33, , 2F
真的超多人覺得我頭很亮..
10/25 15:33, 2F

10/25 16:13, , 3F
原來是正姊
10/25 16:13, 3F

10/25 16:49, , 4F
推生髮水
10/25 16:49, 4F

10/25 16:57, , 5F
推正姊!
10/25 16:57, 5F

10/25 21:41, , 6F
推正姊!
10/25 21:41, 6F

10/25 21:49, , 7F
@@ 愛迪生十世是男的,正姊是 Jeanette Lee, 我只是鳥仔屎.
10/25 21:49, 7F

10/25 21:54, , 8F
阿勒~仔細一看原來是在吐朝我~不過一開始腦袋都是正姊
10/25 21:54, 8F

10/25 21:54, , 9F
so 沒注意到 XD~
10/25 21:54, 9F

10/25 22:00, , 10F
不過原po說的沒錯~這是以炫耀居多orz
10/25 22:00, 10F

10/25 22:00, , 11F
不敢不敢, 只是版主出牌 : 愛迪生的召喚,一點意見而已.
10/25 22:00, 11F

10/25 23:55, , 12F
果然是Jeanette Lee, 所以愛迪生愛打花式撞球?
10/25 23:55, 12F

10/26 01:16, , 13F
xD
10/26 01:16, 13F

10/26 01:49, , 14F
(愛迪生連球桿都沒拿過 @@)
10/26 01:49, 14F

10/26 11:49, , 15F
直接 assign 的確比較快, 在近代的機器都是這樣了
10/26 11:49, 15F
文章代碼(AID): #1GYEUfYE (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1GYEUfYE (C_and_CPP)