12

最大値を高速に計算するためのAGGREGATE Magicのトリックを見つけました。これが整数用であるという唯一の問題ですが、いくつか試してみましたが、符号なし整数用のバージョンを作成する方法がわかりません。

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

何かアドバイス?

編集

他の人が述べたように、未定義の動作が発生するため、これを使用しないでください。最新のアーキテクチャでは、コンパイラは からブランチレス条件付き移動命令を発行できreturn (a > b) ? a : bます。これは、問題の関数よりも高速です。

4

1 に答える 1

8

このコードは何をしますか? a と差 の値を取りますa - b。もちろんa - (a - b)ですb。負の場合は、(a - b) >> 311 のマスクを作成するだけです。a - b

減算でオーバーフローが発生した場合、このコードは正しくありません。ただし、これは符号なし整数の場合と同じです。したがって、コードが値の範囲全体に対して正しくないという事実に満足している場合は、単純に符号なしを無視してこれを使用できます。

inline uint32_t umax(uint32_t a, uint32_t b) {
    return (uint32_t)max((int32_t)a, (int32_t)b);
}
于 2013-07-30T13:14:39.530 に答える