2012-04-22 33 views
2

我有一段代碼被執行了很多,我想優化。它看起來像這樣:快速雙向移位?

int exponent; 
uint32_t mantissa; 

if (exponent < 0) { 
    return mantissa << -exponent; 
} else { 
    return mantissa >> exponent; 
} 

它的目的是很清楚的,它應該右移mantissaexponent的地方,在那裏exponent可以是負數。

有更快的方式來編碼(如果可能,沒有分支)嗎?

回答

4

當然有。也就是說,一個無分支的;我不會說在任何情況下都必須更快。

int exponent; 
uint32_t mantissa; 

return (uint32_t)((uint64_t)mantissa << (32-exponent) >> 32); 
+0

我可能還有其他一些有趣的信息,'mantissa'是一個23位的整數,指數的範圍是[-127,+ 128]。 (是的,IEEE 754 :))。 – orlp 2012-04-22 22:03:12

+0

+1:聰明。我猜想,在最大本地類型也是64位長的機器上,尾數較大(64位)的情況並不存在類似的技巧。 – 2012-04-22 22:08:13

0

看一看這個"integer abs without branching"。這傢伙有一套很棒的技巧,包括你想要的技巧。似乎在你的情況下'sizeof(int)* CHAR_BIT'應該被8代替,如果'exponent'變量類型永不改變。

順便問一下,你確定這個特殊的'if'語句是由於分支引起的性能問題嗎?我的意思是,如果問題在於其他地方的數據位置不佳,那麼優化分支是沒有意義的。