W prostej C (long long są 64-bitowe na mojej konfiguracji), wykonane z podobnych wdrożeń Java: (zaktualizowane po trochę więcej czytania na Hamminga masy)
Trochę więcej wyjaśnienie: Górna część po prostu ustawia cały bit na prawo od najbardziej znaczącego 1, a następnie neguje go. (tzn. wszystkie liczby 0 do "lewej" najbardziej znaczącej wartości 1 wynoszą teraz 1, a wszystko inne 0).
Następnie użyłem implementacji Hamming Weight, aby policzyć bity.
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);
Chciałbym zobaczyć, jak to było pod względem wydajności. Przetestowałem to z kilkoma wartościami i wydaje się, że działa.
Czy jesteś zainteresowany C, C# lub C++? Teoria jest taka sama, ale języki są różne. –
Ponieważ zakładałem, że jest w tym trochę magii, która wygląda tak samo we wszystkich językach, tak naprawdę nie ma to znaczenia. – thr
Google "fxtbook.pdf", rozdział 1.6.1 –