Bird
Raised Fist0
DSA Goprogramming~5 mins

Count Set Bits Brian Kernighan Algorithm in DSA Go - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What does the Brian Kernighan algorithm do in the context of counting set bits?
It efficiently counts the number of 1s (set bits) in the binary representation of a number by repeatedly turning off the rightmost set bit until the number becomes zero.
Click to reveal answer
intermediate
Explain the key operation n = n & (n - 1) in Brian Kernighan's algorithm.
This operation removes the rightmost set bit from n. It works because subtracting 1 flips all bits after the rightmost set bit, and ANDing with n clears that bit.
Click to reveal answer
intermediate
Why is Brian Kernighan's algorithm more efficient than checking each bit one by one?
Because it only loops as many times as there are set bits, not the total number of bits, making it faster especially for numbers with few set bits.
Click to reveal answer
beginner
What is the time complexity of Brian Kernighan's algorithm for counting set bits?
O(k), where k is the number of set bits in the number.
Click to reveal answer
beginner
Write the Go code snippet for Brian Kernighan's algorithm to count set bits in an integer.
func countSetBits(n int) int { count := 0 for n > 0 { n = n & (n - 1) count++ } return count }
Click to reveal answer
What does the expression n & (n - 1) do in Brian Kernighan's algorithm?
ARemoves the rightmost set bit from n
BAdds 1 to n
CFlips all bits of n
DChecks if n is even
What is the main advantage of Brian Kernighan's algorithm over checking each bit individually?
AIt works only for even numbers
BIt uses less memory
CIt loops only as many times as there are set bits
DIt converts the number to a string first
If a number has 5 set bits, how many times will Brian Kernighan's loop run?
AAlways 1
BNumber of total bits in the number
CDepends on the number's value
D5
What is the initial value of the count variable in the Go implementation of Brian Kernighan's algorithm?
A1
B0
Cn
D-1
Which of these is NOT true about Brian Kernighan's algorithm?
AIt requires converting the number to binary string
BIt counts set bits efficiently
CIt uses bitwise AND operation
DIt runs in O(k) time where k is number of set bits
Describe how Brian Kernighan's algorithm counts the number of set bits in a number.
Think about how the algorithm reduces the number by clearing bits.
You got /4 concepts.
    Explain why Brian Kernighan's algorithm is more efficient than checking each bit one by one.
    Consider how many times the loop runs compared to total bits.
    You got /4 concepts.

      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