这是一个很好,快速和简单的实现:
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.)
只需从第一个数字开始制作一个面具并继续移动直到它找到一些东西:
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)