What if you could count only the important bits and skip the rest, saving time and effort?
Why Count Set Bits Brian Kernighan Algorithm in DSA C?
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 means going through all bits even if most are zero. This is slow and wastes time, especially for big numbers. It's easy to make mistakes counting so many bits one by one.
The Brian Kernighan Algorithm quickly jumps from one set bit to the next by turning off the rightmost set bit each time. This way, it only counts the bits that are 1, skipping all zeros, making the process much faster and less error-prone.
int countSetBits(int number) {
int count = 0;
while (number > 0) {
if (number & 1) count++;
number >>= 1;
}
return count;
}int countSetBits(int number) {
int count = 0;
while (number) {
number &= (number - 1);
count++;
}
return count;
}This algorithm enables fast and efficient counting of set bits, which is essential in tasks like error detection, cryptography, and network data processing.
In networking, counting set bits helps quickly find how many devices are active in a network mask, improving speed and accuracy in managing connections.
Manual bit counting is slow and error-prone.
Brian Kernighan's method skips zeros and counts only set bits.
This makes counting bits faster and more efficient.
Practice
Solution
Step 1: Understand the algorithm's main operation
The algorithm uses n = n & (n-1) to clear the least significant set bit in each iteration.Step 2: Effect of clearing bits
Each operation reduces the number of set bits by one until the number becomes zero.Final Answer:
It repeatedly clears the least significant set bit until the number becomes zero. -> Option AQuick Check:
Clearing bits one by one = It repeatedly clears the least significant set bit until the number becomes zero. [OK]
- Counting zeros instead of ones
- Shifting without clearing bits
- Confusing decimal digits with bits
Solution
Step 1: Recall the bit clearing operation
The Brian Kernighan algorithm clears the least significant set bit by n = n & (n - 1).Step 2: Verify other options
Options A, B, and D do not clear the least significant set bit correctly.Final Answer:
n = n & (n - 1); -> Option AQuick Check:
Use n & (n-1) to clear bits [OK]
- Using +1 instead of -1
- Using OR or XOR instead of AND
- Confusing bitwise operators
unsigned int n = 13; // binary 1101
int count = 0;
while (n) {
n = n & (n - 1);
count++;
}
printf("%d", count);Solution
Step 1: Analyze initial value and binary form
13 in binary is 1101, which has three set bits (1s).Step 2: Count iterations clearing bits
Each loop clears one set bit: 1101 -> 1100 -> 1000 -> 0000, so loop runs 3 times.Final Answer:
3 -> Option DQuick Check:
Number of set bits in 13 = 3 [OK]
- Counting total bits instead of set bits
- Off-by-one in loop count
- Misreading binary representation
int countSetBits(int n) {
int count = 0;
while (n != 0) {
n = n & (n + 1);
count++;
}
return count;
}Solution
Step 1: Check the bit clearing operation
The code uses n = 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 least significant set bit.Final Answer:
Using n + 1 instead of n - 1 in bit clearing step. -> Option BQuick Check:
Use n & (n-1) to clear bits, not n & (n+1) [OK]
- Using +1 instead of -1
- Ignoring loop condition correctness
- Forgetting to initialize count
Solution
Step 1: Identify Brian Kernighan's approach
For each element, repeatedly clear least significant set bit and count until zero, then sum counts.: For each element, repeatedly clear the least significant set bit until zero and count (using n = n & (n-1)), then sum the counts across elements. This is the direct application of Brian Kernighan's algorithm.Step 2: Why it is most efficient using Brian Kernighan
B (strings) is slow; C (shifts) is O(word size) always; D (lookup) is fast but a separate method, not Brian Kernighan's. Brian Kernighan excels for sparse bits (O(set bits) time).Final Answer:
For each element, repeatedly clear least significant set bit and count until zero, then sum counts. -> Option CQuick Check:
Brian Kernighan on array: apply n & (n-1) loop per element [OK]
- Using string conversion which is slow
- Bit shifting each bit without optimization
- Confusing lookup table with Brian Kernighan method
Ready to prove it?
Pass the test and this pattern moves unknown
