概要:
最速で計算する方法を探しています
(int) x / (int) y
の例外を取得せずにy==0
。代わりに、任意の結果が必要です。
バックグラウンド:
画像処理アルゴリズムをコーディングするとき、(累積された) アルファ値で割る必要があることがよくあります。最も単純なバリアントは、整数演算を使用する単純な C コードです。私の問題は、通常、結果ピクセルのゼロ除算エラーが発生することalpha==0
です。ただし、これはまさに結果がまったく問題にならないピクセルです。ピクセルの色の値は気にしませんalpha==0
。
詳細:
私は次のようなものを探しています:
result = (y==0)? 0 : x/y;
また
result = x / MAX( y, 1 );
x と y は正の整数です。コードはネストされたループで何度も実行されるため、条件分岐を取り除く方法を探しています。
y がバイト範囲を超えていない場合、解決策に満足しています
unsigned char kill_zero_table[256] = { 1, 1, 2, 3, 4, 5, 6, 7, [...] 255 };
[...]
result = x / kill_zero_table[y];
しかし、これは明らかに、より大きな範囲ではうまく機能しません。
最後の質問は次のとおりだと思います: 他のすべての値を変更せずに、0 を他の整数値に変更する最速のビットいじりハックは何ですか?
明確化
分岐のコストが高すぎるとは 100% 確信が持てません。ただし、さまざまなコンパイラが使用されているため、最適化をほとんど行わないベンチマークを好みます (これには疑問があります)。
確かに、コンパイラはビット操作に関しては優れていますが、C では「ドント ケア」の結果を表現できないため、コンパイラは最適化の全範囲を使用することはできません。
コードは完全に C と互換性がある必要があります。主なプラットフォームは、gcc と clang を使用する Linux 64 ビットと MacOS です。