2013-07-30 11 views
8

AGGREGATE Magicからのトリックが高速計算の最大値を見つけました。これが整数の唯一の問題ですが、いくつか試してみましたが、どのように符号なし整数のバージョンを作るのか分かりません。符号なし整数の高速ブランチレス最大

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

アドバイスはありますか?他の人が述べたように、それは未定義の動作を生成するので

EDIT

は、これを使用しないでください。現代のアーキテクチャでは、コンパイラはからブランチレス条件付き移動命令を発行することができます。これは問題の関数より高速です。

+24

待ちを '>返しますb? a:b'? –

+10

この機能はほとんど役に立ちません。 'std :: max'を使います。 –

+2

ええ、パイプラインのある最新のCPUでは、分岐が遅いです。私は、SSEバージョンと同じくらい速く、このバージョンを測定しました。 – plasmacel

答えて

9

このコードは何をしますか?それはaの値をとり、差はa - bです。もちろん、a - (a - b)bです。 (a - b) >> 31は、a - bが負の場合、単に1のマスクを作成します。

このコードは、減算でオーバーフローすると正しくありません。しかし、これは符号なし整数の場合と同じです。だから、あなたのコードは、全体の値の範囲について正しくないことを、事実と満足している場合に限っ、あなたは、単にunsignedness無視して、これを使用することができます:あなたは、これはより高速です本当に確信している、

inline uint32_t umax(uint32_t a, uint32_t b) { 
    return (uint32_t)max((int32_t)a, (int32_t)b); 
} 
関連する問題