如果您指的是运行时性能,那么以下算法(最初找到最高设置位)可能是最快的。我已经修改它以返回编码整数参数所需的字节数:
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 倍。所有数字都对我的硬件有效,在其他计算机上它当然可能不同。