C# の組み込みの数学関数を使用せずに底 2 の対数を計算するにはどうすればよいですか?
アプリケーションで Math.Log と BigInteger.Log を何百万回も繰り返し使用すると、非常に遅くなります。
バイナリ操作を使用して同じことを達成する代替手段に興味があります。実行時間を短縮するのに役立つ場合に備えて、対数近似で間に合わせることができることを覚えておいてください。
対数の整数部分のみに関心があると仮定すると、次のようなことができます。
static int LogBase2(uint value)
{
int log = 31;
while (log >= 0)
{
uint mask = (1 << log);
if ((mask & value) != 0)
return (uint)log;
log--;
}
return -1;
}
(0 の戻り値が間違っていることに注意してください。負の無限大でなければなりませんが、整数データ型にはそのような値がないため、代わりに -1 を返します)
BigInteger の場合、 toByteArray() メソッドを使用してから、最も重要な 1 を手動で見つけ、その後ゼロの数を数えることができます。これにより、整数精度の 2 を底とする対数が得られます。
近似値を使用できる場合は、Intel チップが使用するトリックを使用します。値を適切なサイズの配列に事前計算してから、その配列を参照します。任意の最小値/最大値で配列を開始および終了させることができ、目的の精度を達成するために必要な数の中間値を作成できます。