Discover how a simple trick can make counting bits lightning fast!
Why Count Set Bits Brian Kernighan Algorithm in DSA Python?
Imagine you have a long list of numbers, and you want to know how many bits are set to 1 in each number. Doing this by checking every bit one by one feels like counting every grain of sand on a beach by hand.
Checking each bit manually is slow and boring. It wastes time because you look at bits that are zero and don't add to the count. This makes the process long and error-prone, especially for big numbers.
The Brian Kernighan Algorithm smartly skips all the zero bits and jumps directly from one set bit to the next. It uses a simple trick to remove the rightmost set bit in each step, making counting very fast and neat.
def count_set_bits(number): count = 0 while number > 0: count += number & 1 number >>= 1 return count
def count_set_bits(number): count = 0 while number > 0: number &= number - 1 count += 1 return count
This algorithm lets you count set bits quickly and efficiently, even in very large numbers, saving time and effort.
In networking, counting set bits helps find how many devices are active in a network mask or how many features are enabled in a settings flag.
Manual bit counting checks every bit, which is slow.
Brian Kernighan's method removes one set bit at a time, speeding up counting.
This makes bit counting efficient and practical for big numbers.
Practice
Solution
Step 1: Understand the algorithm's main operation
The Brian Kernighan algorithm clears the least significant set bit in each iteration by doing n = n & (n-1).Step 2: Effect of clearing bits
Each clearing reduces the number of set bits by one until the number becomes zero, counting how many bits were set.Final Answer:
It repeatedly clears the least significant set bit until the number becomes zero. -> Option DQuick Check:
Clearing bits counts set bits [OK]
- Thinking it counts all digits, not just set bits
- Confusing bit shifting with bit clearing
- Counting characters in string form of number
Solution
Step 1: Identify the bit clearing operation
The correct operation to clear the least significant set bit is n = n & (n - 1).Step 2: Understand why other options are incorrect
Using OR, XOR, or addition does not clear the least significant set bit correctly.Final Answer:
n = n & (n - 1) -> Option AQuick Check:
Bit clear uses AND with n-1 [OK]
- Using OR instead of AND
- Using XOR which toggles bits
- Adding numbers instead of bitwise operations
def count_set_bits(n):
count = 0
while n:
n = n & (n - 1)
count += 1
return count
print(count_set_bits(13))Solution
Step 1: Convert 13 to binary
13 in binary is 1101, which has three set bits (1s).Step 2: Count set bits using the algorithm
Each iteration clears one set bit: 1101 -> 1100 -> 1000 -> 0000, total 3 times.Final Answer:
3 -> Option AQuick Check:
Binary 1101 has 3 set bits [OK]
- Counting total bits instead of set bits
- Miscounting binary digits
- Confusing decimal with binary
def count_set_bits(n):
count = 0
while n > 0:
n = n & (n + 1)
count += 1
return count
print(count_set_bits(7))Solution
Step 1: Identify the bit clearing operation
The code uses n & (n + 1), which does not clear the least significant set bit correctly.Step 2: Correct operation for clearing bits
The correct operation is n = n & (n - 1) to clear the rightmost set bit.Final Answer:
Using n & (n + 1) instead of n & (n - 1) -> Option CQuick Check:
Use n & (n - 1) to clear bits [OK]
- Using n & (n + 1) which is incorrect
- Confusing loop condition syntax
- Forgetting to initialize count
nums = [3, 5, 7]
A) def count_bits_list(nums):
return [bin(n).count('1') for n in nums]
B) def count_bits_list(nums):
def count_set_bits(n):
count = 0
while n:
n = n & (n - 1)
count += 1
return count
return [count_set_bits(n) for n in nums]
C) def count_bits_list(nums):
return [sum(int(d) for d in str(n)) for n in nums]
D) def count_bits_list(nums):
return [len(str(n)) for n in nums]Solution
Step 1: Analyze the code snippets
The first snippet uses Python's bin(n).count('1'), which counts set bits but not Brian Kernighan's algorithm. The second snippet implements the algorithm correctly using a while loop that clears the least significant set bit with n = n & (n - 1). The third sums the decimal digits, which is incorrect for bits. The fourth counts the length of the decimal string, also incorrect.Step 2: Confirm correct implementation
The second snippet defines count_set_bits using n = n & (n - 1) in a loop and applies it to each number via list comprehension, which is the proper use of Brian Kernighan's algorithm.Final Answer:
Option B uses Brian Kernighan's algorithm correctly. -> Option BQuick Check:
Correctly uses n & (n-1) loop [OK]
- Using string digit sums instead of bits
- Counting decimal digits instead of set bits
- Confusing built-in binary count with algorithm
Ready to prove it?
Pass the test and this pattern moves unknown
