Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bits counting algorithm (Brian Kernighan) in an integer time complexity

Can someone explains why Brian Kernighan's algorithm takes O(log N) to count set bits (1s) in an integer. A simple implementation of this algorithm is below (in JAVA)

int count_set_bits(int n){     int count = 0;     while(n != 0){         n &= (n-1);         count++;     }     return count; } 

I understand how it works by clearing the rightmost set bit one by one until it becomes 0, but I just don't know how we get O(log N).

like image 227
peter Avatar asked Sep 12 '12 02:09

peter


People also ask

How do you calculate the number of bits in binary?

To count in binary, convert the last 0 in any number to 1 to add 1, and change any digits following the converted 1 back to 0. If all of the digits are already 1s, add a 1 to the beginning of the number and reset all of the other digits to 1.


1 Answers

This algorithm goes through as many iterations as there are set bits. So if we have a 32-bit word with only the high bit set, then it will only go once through the loop. In the worst case, it will pass once per bit. An integer n has log(n) bits, hence the worst case is O(log(n)). Here's your code annotated at the important bits (pun intended):

  int count_set_bits(int n){         int count = 0; // count accumulates the total bits set          while(n != 0){             n &= (n-1); // clear the least significant bit set             count++;         }   } 
like image 92
PengOne Avatar answered Sep 19 '22 02:09

PengOne