В прямой C (долго долго 64 бит на моей установке), взяты из подобных реализаций Java: (обновляется после немного больше чтения на Хемминга весе)
Побольше Объяснение: Верхняя часть просто устанавливает все бит справа от наиболее значимого 1, а затем отменяет его. (т. е. все 0 в «левом» из наиболее значимых 1 теперь 1, а все остальное - 0).
Затем я использовал реализацию Hamming Weight для подсчета бит.
unsigned long long i = 0x0000000000000000LLU;
i |= i >> 1;
i |= i >> 2;
i |= i >> 4;
i |= i >> 8;
i |= i >> 16;
i |= i >> 32;
// Highest bit in input and all lower bits are now set. Invert to set the bits to count.
i=~i;
i -= (i >> 1) & 0x5555555555555555LLU; // each 2 bits now contains a count
i = (i & 0x3333333333333333LLU) + ((i >> 2) & 0x3333333333333333LLU); // each 4 bits now contains a count
i = (i + (i >> 4)) & 0x0f0f0f0f0f0f0f0fLLU; // each 8 bits now contains a count
i *= 0x0101010101010101LLU; // add each byte to all the bytes above it
i >>= 56; // the number of bits
printf("Leading 0's = %lld\n", i);
Мне было бы интересно узнать, насколько это было эффективно. Протестировал его с несколькими значениями, хотя и, похоже, работает.
Вы заинтересованы в C, C# или C++? Теория такая же, но языки разные. –
Так как я предположил, что для этого есть какая-то немного крутая магия, и это выглядит почти так же на всех языках, это не имеет большого значения. – thr
Google «fxtbook.pdf», глава 1.6.1 –