Я только что нашел эту проблему в верхней части результатов поиска и этот код:
int pop(unsigned x) {
unsigned n;
n = (x >> 1) & 033333333333;
x = x - n;
n = (n >> 1) & 033333333333;
x = x - n;
x = (x + (x >> 3)) & 030707070707;
return x % 63;
}
int nlz(unsigned x) {
x = x | (x >> 1);
x = x | (x >> 2);
x = x | (x >> 4);
x = x | (x >> 8);
x = x | (x >>16);
return pop(~x);
}
, где pop имеет значение 1 бит, в несколько раз быстрее, чем первый ответ (с подтверждением).
Я не заметил, вопрос был о 64-битных числах, поэтому здесь:
int nlz(unsigned long x) {
unsigned long y;
long n, c;
n = 64;
c = 32;
do {
y = x >> c;
if (y != 0) {
n = n - c;
x = y;
}
c = c >> 1;
} while (c != 0);
return n - x;
}
- это 64-битный алгоритм, опять же в несколько раз быстрее, чем упомянутое выше.