これらのメソッドを頻繁に呼び出す場合、最速の方法はビット操作ではなく、おそらくルックアップ テーブルです。操作ごとに長さ 511 の配列を定義します。マイナス(引き算)の例
static unsigned char maxTable[511];
memset(maxTable, 0, 255); // If smaller, emulates cutoff at zero
maxTable[255]=0; // If equal - return zero
for (int i=0; i<256; i++)
maxTable[255+i] = i; // If greater - return the difference
配列は静的で、一度だけ初期化されます。これで、減算をインライン メソッドとして、またはプリコンパイラを使用して定義できます。
#define MINUS(A,B) maxTable[A-B+255];
使い方?unsigned char のすべての可能な減算を事前に計算したいとします。結果は -255 から +255 まで変化し、合計 511 通りの結果が得られます。すべての可能な結果の配列を定義しますが、C では負のインデックスからアクセスできないため、+255 ([A-B+255] 内) を使用します。配列の中心へのポインターを定義することにより、このアクションを削除できます。
const unsigned char *result = maxTable+255;
#define MINUS(A,B) result[A-B];
次のように使用します。
bsub = MINUS(13,15); // i.e 13-15 with zero cutoff as requested
実行が非常に高速であることに注意してください。結果を得るために、1 つの減算と 1 つのポインター参照のみが必要です。分岐なし。静的配列は非常に短いため、計算をさらに高速化するために CPU のキャッシュに完全にロードされます。
追加でも同じことが機能しますが、テーブルが少し異なります (最初の 256 要素はインデックスになり、最後の 255 要素は 255 に等しくなり、255 を超えるカットオフをエミュレートします。
ビット操作に固執するなら、(a>b) を使用する答えは間違っています。これはまだ分岐として実装される可能性があります。サインビット手法を使用する
// (num1>num2) ? 1 : 0
#define is_int_biggerNotEqual( num1,num2) ((((__int32)((num2)-(num1)))&0x80000000)>>31)
これで、減算と加算の計算に使用できます。
分岐を使用せずに関数 max()、min() をエミュレートする場合:
inline __int32 MIN_INT(__int32 x, __int32 y){ __int32 d=x-y; return y+(d&(d>>31)); }
inline __int32 MAX_INT(__int32 x, __int32 y){ __int32 d=x-y; return x-(d&(d>>31)); }
上記の例では、32 ビット整数を使用しています。64 に変更することもできますが、32 ビットの計算の方が少し高速に実行されると思います。君による