推 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