Bird
Raised Fist0
DSA Goprogramming

Count Set Bits Brian Kernighan Algorithm in DSA Go

Choose your learning style10 modes available
Mental Model
Count how many 1s are in a number's binary form 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 marked: 1 -> 1 -> 0 -> [1↑]
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: 1101 & (1101 - 1) = 1101 & 1100 = 1100
1100 (binary), count = 1
Why: We remove the rightmost 1 to count it and reduce the number
Step 2: Remove rightmost set bit: 1100 & (1100 - 1) = 1100 & 1011 = 1000
1000 (binary), count = 2
Why: Remove next rightmost 1 to count it
Step 3: Remove rightmost set bit: 1000 & (1000 - 1) = 1000 & 0111 = 0000
0000 (binary), count = 3
Why: Remove last set bit, number becomes zero, stop
Result:
0000 (binary), count = 3
Answer: 3 set bits in 13
Annotated Code
DSA Go
package main

import "fmt"

// countSetBits counts how many bits are set to 1 using Brian Kernighan's algorithm
func countSetBits(n int) int {
    count := 0
    for n > 0 {
        n = n & (n - 1) // remove rightmost set bit
        count++         // increment count for each removed bit
    }
    return count
}

func main() {
    number := 13
    result := countSetBits(number)
    fmt.Printf("Number of set bits in %d is %d\n", number, result)
}
for n > 0 {
loop until all set bits are removed
n = n & (n - 1) // remove rightmost set bit
remove rightmost set bit to count it
count++ // increment count for each removed bit
count how many bits removed
OutputSuccess
Number of set bits in 13 is 3
Complexity Analysis
Time: O(k) where k is the 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: Compared to checking all bits (O(log n)), this is faster when number has few set bits
Edge Cases
number = 0 (no set bits)
loop never runs, count remains 0
DSA Go
for n > 0 {
number = 1 (single set bit)
one iteration removes the only set bit, count = 1
DSA Go
for n > 0 {
number with all bits set (e.g., 7 for 3 bits)
loop runs for all set bits, count equals number of bits
DSA Go
for n > 0 {
When to Use This Pattern
When you need to count how many bits are 1 in a number efficiently, use Brian Kernighan's algorithm because it skips zero bits and counts only set bits.
Common Mistakes
Mistake: Using n & 1 and shifting right to check each bit instead of removing rightmost set bit
Fix: Use n = n & (n - 1) to remove rightmost set bit directly for faster counting
Summary
Counts how many bits are set to 1 in a number by repeatedly removing the rightmost set bit.
Use when you want an efficient way to count set bits without checking every bit.
The key insight is that n & (n - 1) removes the rightmost set bit, reducing the problem size each step.

Practice

(1/5)
1. What does the Brian Kernighan algorithm do when counting set bits in an integer?
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 until it becomes zero and counts the shifts
D. It converts the number to a string and counts '1' characters

Solution

  1. Step 1: Understand the algorithm's main operation

    The Brian Kernighan algorithm clears the least significant set bit by doing n = n & (n-1) repeatedly.
  2. Step 2: Effect of clearing bits

    Each operation removes one '1' bit, counting how many set bits exist until n 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 counts set bits [OK]
Hint: Clear least set bit repeatedly to count ones [OK]
Common Mistakes:
  • Counting total bits instead of set bits
  • Using string conversion instead of bitwise operations
  • Shifting without checking bits
2. Which of the following is the correct syntax for the Brian Kernighan loop in Go to count set bits of an integer n?
easy
A. while n > 0 { count++; n = n - 1 }
B. for n > 0 { count += n & 1; n = n >> 1 }
C. for n != 0 { count++; n = n & (n - 1) }
D. for i := 0; i < 32; i++ { if n & (1 << i) != 0 { count++ } }

Solution

  1. Step 1: Identify the Brian Kernighan loop condition

    The loop runs while n is not zero, clearing the least significant set bit each iteration.
  2. Step 2: Confirm the bit clearing operation

    The operation n = n & (n - 1) clears the least significant set bit correctly.
  3. Final Answer:

    for n != 0 { count++; n = n & (n - 1) } -> Option C
  4. Quick Check:

    Loop with n & (n-1) clears bits [OK]
Hint: Use n = n & (n-1) inside for loop [OK]
Common Mistakes:
  • Using shift instead of bit clear
  • Using while instead of for in Go
  • Counting bits by subtracting 1 only
3. What is the output of the following Go code snippet?
func countSetBits(n int) int {
    count := 0
    for n != 0 {
        n = n & (n - 1)
        count++
    }
    return count
}

fmt.Println(countSetBits(13))
medium
A. 2
B. 3
C. 4
D. 5

Solution

  1. Step 1: Convert 13 to binary

    13 in binary is 1101, which has three set bits (1s).
  2. Step 2: Apply Brian Kernighan algorithm

    Each iteration clears one set bit, so count increments 3 times until n becomes 0.
  3. Final Answer:

    3 -> Option B
  4. Quick Check:

    Binary 1101 has 3 ones [OK]
Hint: Count ones in binary 13 = 3 [OK]
Common Mistakes:
  • Counting total bits instead of set bits
  • Miscounting binary digits
  • Confusing bitwise AND with OR
4. Identify the error in this Go code snippet that tries to count set bits using Brian Kernighan's algorithm:
func countSetBits(n int) int {
    count := 0
    for n > 0 {
        count = count + (n & 1)
        n = n & (n - 1)
    }
    return count
}
medium
A. Using n & 1 to count bits conflicts with n = n & (n - 1) clearing bits
B. Loop condition should be n != 0 instead of n > 0
C. Count variable should be initialized to 1
D. Missing return statement

Solution

  1. Step 1: Analyze counting method

    The code adds n & 1 to count, which checks the least significant bit.
  2. Step 2: Analyze bit clearing step

    Then it clears the least significant set bit with n = n & (n - 1), which may skip bits.
  3. Step 3: Conflict explanation

    Using both methods together causes incorrect counting because n & 1 and clearing bits are mixed incorrectly.
  4. Final Answer:

    Using n & 1 to count bits conflicts with n = n & (n - 1) clearing bits -> Option A
  5. Quick Check:

    Mixing bit check and clear causes wrong count [OK]
Hint: Use either bit check or bit clear, not both [OK]
Common Mistakes:
  • Mixing bitwise AND with bit clearing
  • Incorrect loop condition
  • Wrong initialization of count
5. Given a list of integers [7, 8, 15, 23], which Go code snippet correctly uses Brian Kernighan's algorithm to return a map of each integer to its count of set bits?
hard
A. func countSetBits(n int) int { count := 0 for n != 0 { n = n & (n - 1) count++ } return count } func mapSetBits(nums []int) map[int]int { result := make(map[int]int) for _, num := range nums { result[countSetBits(num)] = num } return result }
B. func countSetBits(n int) int { count := 0 for n > 0 { count += n & 1 n = n >> 1 } return count } func mapSetBits(nums []int) map[int]int { result := make(map[int]int) for i := 0; i < len(nums); i++ { result[i] = countSetBits(nums[i]) } return result }
C. func countSetBits(n int) int { count := 0 for n != 0 { n = n & (n - 1) count++ } return count } func mapSetBits(nums []int) map[int]int { result := make(map[int]int) for i, num := range nums { result[i] = countSetBits(num) } return result }
D. func countSetBits(n int) int { count := 0 for n != 0 { n = n & (n - 1) count++ } return count } func mapSetBits(nums []int) map[int]int { result := make(map[int]int) for _, num := range nums { result[num] = countSetBits(num) } return result }

Solution

  1. Step 1: Check countSetBits function correctness

    func countSetBits(n int) int { count := 0 for n != 0 { n = n & (n - 1) count++ } return count } func mapSetBits(nums []int) map[int]int { result := make(map[int]int) for _, num := range nums { result[num] = countSetBits(num) } return result } uses Brian Kernighan's algorithm correctly to count set bits.
  2. Step 2: Check mapSetBits function logic

    The mapSetBits function correctly maps each number (as key) to its set bit count (as value).
  3. Step 3: Verify other options

    func countSetBits(n int) int { count := 0 for n > 0 { count += n & 1 n = n >> 1 } return count } func mapSetBits(nums []int) map[int]int { result := make(map[int]int) for i := 0; i < len(nums); i++ { result[i] = countSetBits(nums[i]) } return result } uses shift method and wrong map keys; func countSetBits(n int) int { count := 0 for n != 0 { n = n & (n - 1) count++ } return count } func mapSetBits(nums []int) map[int]int { result := make(map[int]int) for i, num := range nums { result[i] = countSetBits(num) } return result } uses index as key; func countSetBits(n int) int { count := 0 for n != 0 { n = n & (n - 1) count++ } return count } func mapSetBits(nums []int) map[int]int { result := make(map[int]int) for _, num := range nums { result[countSetBits(num)] = num } return result } reverses key and value.
  4. Final Answer:

    The code that maps num to countSetBits(num) -> Option D
  5. Quick Check:

    Map keys are numbers, values are counts [OK]
Hint: Map number to countSetBits result using correct keys [OK]
Common Mistakes:
  • Using index as map key instead of number
  • Swapping keys and values in map
  • Using shift method instead of Brian Kernighan
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