ランタイム パフォーマンスを意味する場合は、次のアルゴリズム (最初に設定された最高ビットを見つける) がおそらく最速です。整数引数をエンコードするために必要なバイト数を返すように、既に変更しています。
private static final int[] DE_BRUIJN_BIT_POSITION_LUT = {
0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30,
8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31
};
public static int nbBytes2(int n) {
n |= n >> 1;
n |= n >> 2;
n |= n >> 4;
n |= n >> 8;
n |= n >> 16;
return DE_BRUIJN_BIT_POSITION_LUT[((n * 0x07C4ACDD) >> 27) & 0x1f] / 8 + 1;
}
より複雑に見えますが、ループや条件付き処理がないため、最新の CPU パイプラインを最適に使用できます。
De Bruijn アルゴリズムをメソッドと比較すると、メソッドは 0x0-0xff の範囲の入力に対して約 4 倍高速です (メソッドも分岐しません)。範囲 0x100-0xfff の入力の場合、私の方法は 19 倍速く、入力 0x10000-0xffffff の場合は 28 倍速く、>0x1000000 の入力の場合は 35 倍速くなります。すべての数値は私のハードウェアで有効ですが、他のコンピューターではもちろん異なる場合があります。