Bird
Raised Fist0
DSA Cprogramming

Count Set Bits Brian Kernighan Algorithm in DSA C

Choose your learning style10 modes available
Mental Model
Count how many 1s are in the binary form of a number by removing the rightmost 1 one by one.
Analogy: Imagine you have a row of lit candles (1s). Each time you blow out the rightmost lit candle, you count one until none are left.
Number: 13 (binary 1101)
Bits: 1 -> 1 -> 0 -> 1
Rightmost 1 is at the end here ↑
Dry Run Walkthrough
Input: number = 13 (binary 1101)
Goal: Count how many bits are set to 1 in the number 13
Step 1: Remove rightmost set bit from 1101 (13) using n = n & (n-1)
1101 (13) & 1100 (12) = 1100 (12)
Why: This removes the rightmost 1 bit, reducing the count by one
Step 2: Remove rightmost set bit from 1100 (12)
1100 (12) & 1011 (11) = 1000 (8)
Why: Again remove rightmost 1 bit to count it
Step 3: Remove rightmost set bit from 1000 (8)
1000 (8) & 0111 (7) = 0000 (0)
Why: Last set bit removed, no more 1s left
Result:
Counted 3 set bits in 13 (1101)
Annotated Code
DSA C
#include <stdio.h>

// Function to count set bits using Brian Kernighan's Algorithm
int countSetBits(int n) {
    int count = 0;
    while (n) {
        n = n & (n - 1); // remove rightmost set bit
        count++;
    }
    return count;
}

int main() {
    int number = 13;
    int result = countSetBits(number);
    printf("Number of set bits in %d is %d\n", number, result);
    return 0;
}
while (n) {
loop until all set bits are removed
n = n & (n - 1); // remove rightmost set bit
remove rightmost 1 bit to count it
count++;
increment count for each removed set bit
OutputSuccess
Number of set bits in 13 is 3
Complexity Analysis
Time: O(k) where k is number of set bits, because each iteration removes one set bit
Space: O(1) because only a few variables are used regardless of input size
vs Alternative: Better than checking all bits (O(log n)) because it only loops over set bits, which can be fewer
Edge Cases
number = 0 (no set bits)
loop does not run, count remains 0
DSA C
while (n) {
number = 1 (single set bit)
loop runs once, count becomes 1
DSA C
while (n) {
number with all bits set (e.g., 15 for 4 bits)
loop runs once per set bit, counting all
DSA C
while (n) {
When to Use This Pattern
When asked to count how many bits are 1 in a number efficiently, use Brian Kernighan's algorithm because it quickly removes one set bit per step.
Common Mistakes
Mistake: Looping over all bits by shifting and checking each bit instead of removing set bits
Fix: Use n = n & (n - 1) to remove rightmost set bit directly for faster counting
Summary
Counts the number of 1 bits in a number by repeatedly removing the rightmost set bit.
Use when you need a fast way to count set bits without checking every bit.
The key insight is that n & (n-1) drops the lowest set bit, reducing work to only set bits.

Practice

(1/5)
1. What does the Brian Kernighan algorithm do when counting set bits in a number?
easy
A. It repeatedly clears the least significant set bit until the number becomes zero.
B. It counts the total number of digits in the binary representation.
C. It shifts the number right and counts zeros.
D. It converts the number to decimal and counts digits.

Solution

  1. 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.
  2. Step 2: Effect of clearing bits

    Each operation reduces the number of set bits by one until the number becomes zero.
  3. Final Answer:

    It repeatedly clears the least significant set bit until the number becomes zero. -> Option A
  4. Quick Check:

    Clearing bits one by one = It repeatedly clears the least significant set bit until the number becomes zero. [OK]
Hint: Clear least set bit repeatedly to count set bits [OK]
Common Mistakes:
  • Counting zeros instead of ones
  • Shifting without clearing bits
  • Confusing decimal digits with bits
2. Which of the following is the correct syntax to clear the least significant set bit in C using Brian Kernighan's method?
easy
A. n = n & (n - 1);
B. n = n | (n - 1);
C. n = n & (n + 1);
D. n = n ^ (n - 1);

Solution

  1. Step 1: Recall the bit clearing operation

    The Brian Kernighan algorithm clears the least significant set bit by n = n & (n - 1).
  2. Step 2: Verify other options

    Options A, B, and D do not clear the least significant set bit correctly.
  3. Final Answer:

    n = n & (n - 1); -> Option A
  4. Quick Check:

    Use n & (n-1) to clear bits [OK]
Hint: Use n & (n-1) to clear least set bit [OK]
Common Mistakes:
  • Using +1 instead of -1
  • Using OR or XOR instead of AND
  • Confusing bitwise operators
3. What is the output of the following C code snippet?
unsigned int n = 13; // binary 1101
int count = 0;
while (n) {
  n = n & (n - 1);
  count++;
}
printf("%d", count);
medium
A. 5
B. 2
C. 4
D. 3

Solution

  1. Step 1: Analyze initial value and binary form

    13 in binary is 1101, which has three set bits (1s).
  2. Step 2: Count iterations clearing bits

    Each loop clears one set bit: 1101 -> 1100 -> 1000 -> 0000, so loop runs 3 times.
  3. Final Answer:

    3 -> Option D
  4. Quick Check:

    Number of set bits in 13 = 3 [OK]
Hint: Count set bits by clearing one bit per loop [OK]
Common Mistakes:
  • Counting total bits instead of set bits
  • Off-by-one in loop count
  • Misreading binary representation
4. Identify the error in this C code snippet that tries to count set bits using Brian Kernighan's algorithm:
int countSetBits(int n) {
  int count = 0;
  while (n != 0) {
    n = n & (n + 1);
    count++;
  }
  return count;
}
medium
A. Missing initialization of count variable.
B. Using n + 1 instead of n - 1 in bit clearing step.
C. Incorrect return type of the function.
D. Loop condition should be while (n > 0).

Solution

  1. Step 1: Check the bit clearing operation

    The code uses n = n & (n + 1), which does not clear the least significant set bit correctly.
  2. Step 2: Correct operation for clearing bits

    The correct operation is n = n & (n - 1) to clear the least significant set bit.
  3. Final Answer:

    Using n + 1 instead of n - 1 in bit clearing step. -> Option B
  4. Quick Check:

    Use n & (n-1) to clear bits, not n & (n+1) [OK]
Hint: Use n & (n-1) to clear bits, not n & (n+1) [OK]
Common Mistakes:
  • Using +1 instead of -1
  • Ignoring loop condition correctness
  • Forgetting to initialize count
5. Given an array of unsigned integers, which approach using Brian Kernighan's algorithm is most efficient to find the total count of set bits in all elements?
hard
A. Shift each number bit by bit and count set bits using bitwise AND with 1.
B. Convert each number to binary string and count '1's using string functions.
C. For each element, repeatedly clear least significant set bit and count until zero, then sum counts.
D. Use a lookup table for each byte and sum counts for all bytes in each number.

Solution

  1. 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.
  2. 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).
  3. Final Answer:

    For each element, repeatedly clear least significant set bit and count until zero, then sum counts. -> Option C
  4. Quick Check:

    Brian Kernighan on array: apply n & (n-1) loop per element [OK]
Hint: Brian Kernighan per element: clear LSB until zero, sum counts [OK]
Common Mistakes:
  • Using string conversion which is slow
  • Bit shifting each bit without optimization
  • Confusing lookup table with Brian Kernighan method
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard