這樣做的其中一種方式是在問題鏈接的Bit Hacks頁面上描述,它利用了De Bruijn sequence。不幸的是,這個頁面並沒有給出所述序列的64位版本。 This useful page解釋瞭如何構建De Bruijn序列,以及this one給出了用C++編寫的序列生成器的例子。如果我們適應給定的代碼,我們可以生成多個序列,其中一個在下面的C#代碼給出:
public static class BitScanner
{
private const ulong Magic = 0x37E84A99DAE458F;
private static readonly int[] MagicTable =
{
0, 1, 17, 2, 18, 50, 3, 57,
47, 19, 22, 51, 29, 4, 33, 58,
15, 48, 20, 27, 25, 23, 52, 41,
54, 30, 38, 5, 43, 34, 59, 8,
63, 16, 49, 56, 46, 21, 28, 32,
14, 26, 24, 40, 53, 37, 42, 7,
62, 55, 45, 31, 13, 39, 36, 6,
61, 44, 12, 35, 60, 11, 10, 9,
};
public static int BitScanForward(ulong b)
{
return MagicTable[((ulong) ((long) b & -(long) b)*Magic) >> 58];
}
public static int BitScanReverse(ulong b)
{
b |= b >> 1;
b |= b >> 2;
b |= b >> 4;
b |= b >> 8;
b |= b >> 16;
b |= b >> 32;
b = b & ~(b >> 1);
return MagicTable[b*Magic >> 58];
}
}
我也貼了序列發生器的我的C#端口github
另一個相關的文章沒有在De Bruijn序列的體面封面的問題中提到,可以找到here。
這是不是基本上相同http://stackoverflow.com/questions/10439242/count-leading-zeroes-in-an-int32? 顯然,你必須將它調整爲64位,它會給你與你正在尋找的號碼相反的信息,但它表達了相同的信息。 – Taekahn
@Taekahn調整到64位並不是微不足道的。嘗試一下。正如我在問題中所承認的那樣,32位答案確實存在於SO上。 –