優れたプログラミング リソースである Bit Twiddling Hacksは、32 ビット整数の log2 を計算する次の方法を提案しています (こちら)。
#define LT(n) n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n
static const char LogTable256[256] =
{
-1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
LT(4), LT(5), LT(5), LT(6), LT(6), LT(6), LT(6),
LT(7), LT(7), LT(7), LT(7), LT(7), LT(7), LT(7), LT(7)
};
unsigned int v; // 32-bit word to find the log of
unsigned r; // r will be lg(v)
register unsigned int t, tt; // temporaries
if (tt = v >> 16)
{
r = (t = tt >> 8) ? 24 + LogTable256[t] : 16 + LogTable256[tt];
}
else
{
r = (t = v >> 8) ? 8 + LogTable256[t] : LogTable256[v];
}
と述べています
ルックアップ テーブル方式では、32 ビット値のログを見つけるのに約 7 回の操作しかかかりません。64 ビット量に拡張すると、約 9 回の操作が必要になります。
しかし、残念ながら、アルゴリズムを 64 ビット整数に拡張するために実際にどの方法を使用すべきかについての追加情報はありません。
この種の 64 ビット アルゴリズムがどのように見えるかについてのヒントはありますか?