Re: [問題] 反轉字串裡面的字元
原文恕刪。
一開始只是述敘一點面試的過程,真的沒想到在 swap 打轉了一下,
下面是回應及補充 xor swap 的東西。
※ 引述《cuteclare (清兒)》之銘言:
: void swapChars(char * a,char * b) {
: (* a) ^= (* b);
: (* b) ^= (* a);
: (* a) ^= (* b);
: }
推
10/25 12:14,
10/25 12:14
→
10/25 12:18,
10/25 12:18
推
10/25 12:48,
10/25 12:48
→
10/25 12:52,
10/25 12:52
推
10/25 13:43,
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
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
10/25 21:49, 7F
推
10/25 21:54, , 8F
10/25 21:54, 8F
→
10/25 21:54, , 9F
10/25 21:54, 9F
推
10/25 22:00, , 10F
10/25 22:00, 10F
→
10/25 22:00, , 11F
10/25 22:00, 11F
推
10/25 23:55, , 12F
10/25 23:55, 12F
→
10/26 01:16, , 13F
10/26 01:16, 13F
→
10/26 01:49, , 14F
10/26 01:49, 14F
推
10/26 11:49, , 15F
10/26 11:49, 15F
討論串 (同標題文章)