What if you could count all the 1s in a number's binary form without checking every single bit?
Why Count Set Bits Brian Kernighan Algorithm in DSA Javascript?
Imagine you have a long list of numbers, and you want to know how many 1s are in their binary forms. Doing this by checking each bit one by one feels like counting grains of sand on a beach.
Checking every bit manually means going through all bits even if most are zeros. This takes a lot of time and can be very slow for big numbers. It's easy to make mistakes and lose patience.
The Brian Kernighan Algorithm smartly jumps from one 1-bit to the next by turning off the rightmost 1-bit each time. This way, it only counts the actual 1s, skipping all zeros quickly and saving time.
function countSetBits(number) {
let count = 0;
while (number > 0) {
count += number & 1;
number >>= 1;
}
return count;
}function countSetBits(number) {
let count = 0;
while (number > 0) {
number &= (number - 1);
count++;
}
return count;
}This algorithm makes counting 1s in binary fast and efficient, even for very large numbers.
In networking, counting set bits helps quickly find how many devices are active in a network mask, speeding up network management.
Manual bit checking is slow and error-prone.
Brian Kernighan Algorithm skips zeros and counts only 1s efficiently.
It makes bit counting fast and practical for big numbers.
Practice
Solution
Step 1: Understand the algorithm's main operation
The algorithm clears the least significant set bit by doing n = n & (n-1) repeatedly.Step 2: Effect of clearing bits
Each operation removes one set bit, counting how many times this happens gives the total set bits.Final Answer:
It repeatedly clears the least significant set bit until the number becomes zero -> Option CQuick Check:
Clearing bits counts set bits [OK]
- Counting total digits instead of set bits
- Counting zeros instead of ones
- Using string length instead of bit operations
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: Verify other options
Other options do not clear the least significant set bit correctly.Final Answer:
n = n & (n - 1); -> Option BQuick Check:
Use AND with (n-1) to clear bit [OK]
- Using OR or XOR instead of AND
- Adding instead of subtracting 1
- Confusing bitwise operators
function countSetBits(n) {
let count = 0;
while (n > 0) {
n = n & (n - 1);
count++;
}
return count;
}
console.log(countSetBits(13));Solution
Step 1: Convert 13 to binary
13 in binary is 1101, which has three set bits (1s).Step 2: Apply Brian Kernighan's algorithm
Each loop clears one set bit, so count increments 3 times before n becomes 0.Final Answer:
3 -> Option AQuick Check:
13 (1101) has 3 set bits [OK]
- Counting total bits instead of set bits
- Miscounting binary representation
- Off-by-one errors in loop
function countSetBits(n) {
let 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
The correct operation is n = n & (n - 1) to clear the least significant set bit.Final Answer:
Using n & (n + 1) instead of n & (n - 1) -> Option DQuick Check:
Use n & (n-1) to clear bits [OK]
- Using n & (n + 1) which is incorrect
- Confusing loop types
- Forgetting to return count
const arr = [3, 5, 7];
// Choose the correct code to count all set bits
A) let total = 0;
for(let n of arr) {
while(n > 0) {
n = n & (n - 1);
total++;
}
}
console.log(total);
B) let total = 0;
for(let n of arr) {
total += n.toString(2).length;
}
console.log(total);
C) let total = 0;
for(let n of arr) {
while(n > 0) {
n = n | (n - 1);
total++;
}
}
console.log(total);
D) let total = 0;
for(let n of arr) {
total += n & (n - 1);
}
console.log(total);Solution
Step 1: Identify the correct implementation
The implementation usingwhile(n > 0) { n = n & (n - 1); total++; }correctly applies Brian Kernighan's algorithm by clearing the least significant set bit repeatedly for each array element and incrementing the total count each time.Step 2: Eliminate incorrect options
The option usingn.toString(2).lengthcounts all bits including zeros; usingn | (n - 1)does not clear set bits correctly; addingn & (n - 1)directly does not count the number of set bits.Final Answer:
Correctly counts set bits using Brian Kernighan's method -> Option AQuick Check:
Clear bits and count in loop [OK]
- Counting total binary length instead of set bits
- Using OR instead of AND for clearing bits
- Adding bitwise results instead of counts
Ready to prove it?
Pass the test and this pattern moves unknown
