В прямом C (long long - 64-битный в моей установке), взятый из аналогичных реализаций Java: (обновлено после небольшого прочтения веса Хэмминга)
Немного больше объяснения: верхняя часть просто устанавливаетвсе бит справа от самого значимого 1, а затем отрицает его.(то есть все 0 слева от наиболее значимого 1 теперь равны 1, а все остальное равно 0).
Затем я использовал реализацию Вес Хэмминга для подсчета битов.
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);
Мне было бы любопытно посмотреть, насколько это эффективно с точки зрения эффективности.Протестировал его с несколькими значениями, и он, кажется, работает.