如何使用C#计算整数的二进制表示中的尾随零

abe*_*406 3 c# algorithm binary numbers

如何有效地计算整数的二进制表示中的尾随零的数量?

Luk*_*keH 8

这是一个很好,快速和简单的实现:

public static int NumberOfTrailingZeros(int i)
{
    return _lookup[(i & -i) % 37];
}

private static readonly int[] _lookup =
    {
        32, 0, 1, 26, 2, 23, 27, 0, 3, 16, 24, 30, 28, 11, 0, 13, 4, 7, 17,
        0, 25, 22, 31, 15, 29, 10, 12, 6, 0, 21, 14, 9, 5, 20, 8, 19, 18
    };
Run Code Online (Sandbox Code Playgroud)

(摘自http://graphics.stanford.edu/~seander/bithacks.html#ZerosOnRightModLookup.)

  • 我没有投反对票,但我可以很好地想象为什么人们会投反对票。那个模部分是昂贵的。在最好的情况下,它将转换为 64 位长乘法,或者在最坏的情况下甚至转换为花费数十个周期的除法。它需要 37*4 字节的内存。总而言之,如果不是更糟,它几乎不会比下面的迭代版本更好。考虑到几十年来大多数架构都具有 clz 指令,您的建议并不是很有帮助。 (3认同)

Ser*_*rvy 7

只需从第一个数字开始制作一个面具并继续移动直到它找到一些东西:

public static int numTrailingBinaryZeros(int n)
{
    int mask = 1;
    for (int i = 0; i < 32; i++, mask <<= 1)
        if ((n & mask) != 0)
            return i;

    return 32;
}
Run Code Online (Sandbox Code Playgroud)