これらのメソッドを頻繁に呼び出す場合、最速の方法はビット操作ではなく、おそらくルックアップテーブルです。操作ごとに長さ511の配列を定義します。マイナス(減算)の例
static unsigned char maxTable[511];
memset(maxTable, 0, 255);
maxTable[255]=0;
for (int i=0; i<256; i++)
maxTable[255+i] = i;
配列は静的であり、一度だけ初期化されます。これで、減算をインラインメソッドとして、またはプリコンパイラを使用して定義できます。
#define MINUS(A,B) maxTable[A-B+255];
使い方?さて、unsignedcharsのすべての可能な減算を事前に計算したいと思います。結果は-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)
実行は非常に高速であることに注意してください。結果を得るために1つの減算と1つのポインタの違いだけ。分岐なし。静的配列は非常に短いため、計算をさらに高速化するためにCPUのキャッシュに完全にロードされます
同じことが追加でも機能しますが、テーブルが少し異なります(255を超えるカットオフをエミュレートするために、最初の256要素がインデックスになり、最後の255要素が255に等しくなります。
ビット演算を主張する場合、(a> b)を使用する答えは間違っています。これはまだ分岐として実装される可能性があります。符号ビット技術を使用する
#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ビットの計算は少し速く実行されると思います。あなた次第
y ^ ((x ^ y) & -(x < y))
以下のためint
の型を評価min(x, y)
分岐せず。これは、これまでの状況に基づいて、最終的な解決策の一部を形成する可能性があります。