2013-07-30 45 views
8

我發現AGGREGATE Magic的技巧用於快速計算最大值。唯一的問題是這是整數,但我已經嘗試了一些東西,不知道如何爲無符號整數做一個版本。無符號整數的快速無分支最大值

inline int32_t max(int32_t a, int32_t b) 
{ 
    return a - ((a-b) & (a-b)>>31); 
} 

有什麼建議嗎?

編輯

不要使用這個,因爲其他人說,它產生不確定的行爲。對於任何現代體系結構,編譯器將能夠發出來自return (a > b) ? a : b的無分支條件移動指令,這將比所討論的函數更快。

+24

等待,你真的相信這是比快'返回> b? a:b'? –

+10

這個功能幾乎沒用。使用'std :: max'。 –

+2

是的,在現代CPU與管道,分支是緩慢的。我測量過,這個版本跟SSE版本一樣快,如果不是更快的話。 – plasmacel

回答

9

這段代碼做了什麼?它取a和差值a - b。當然,a - (a - b)b。如果a - b爲負,(a - b) >> 31只是創建一個掩碼。

這段代碼是不正確的,如果你得到減法溢出。然而,這與無符號整數是一樣的故事。所以,當且僅當你的內容與事實,你的代碼是不是對整個值範圍正確,你可以簡單地忽略unsignedness並使用此:

inline uint32_t umax(uint32_t a, uint32_t b) { 
    return (uint32_t)max((int32_t)a, (int32_t)b); 
}