Count total set bits in all numbers from 1 to N | Set 3

Given a positive integer N, the task is to count the total number of set bits in binary representation of all the numbers from 1 to N.

Examples:

Input: N = 3
Output: 4
setBits(1) + setBits(2) + setBits(3) = 1 + 1 + 2 = 4



Input: N = 6
Output: 9

Approach: Solution to this problem has been published in the Set 1 and the Set 2 of this article. Here, a dynamic programming based approach is discussed.

  • Base case: Number of set bits in 0 and 1 are 0 and 1 respectively.
  • Now for every element i from the range [2, N], if i is even then it will have the same number of set bits as i / 2 because to get the number i we just shift the number i / 2 by one. While shifting, the number of set bits does not change.
  • Similarly, if i is odd then it will have 1 additional set bit at 0th position than i – 1 which was even.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to return the count of
// set bits in all the integers
// from the range [1, n]
int countSetBits(int n)
{
  
    // To store the required count
    // of the set bits
    int cnt = 0;
  
    // To store the count of set
    // bits in every integer
    vector<int> setBits(n + 1);
  
    // 0 has no set bit
    setBits[0] = 0;
  
    // 1 has a single set bit
    setBits[1] = 1;
  
    // For the rest of the elements
    for (int i = 2; i <= n; i++) {
  
        // If current element i is even then
        // it has set bits equal to the count
        // of the set bits in i / 2
        if (i % 2 == 0) {
            setBits[i] = setBits[i / 2];
        }
  
        // Else it has set bits equal to one
        // more than the previous element
        else {
            setBits[i] = setBits[i - 1] + 1;
        }
    }
  
    // Sum all the set bits
    for (int i = 0; i <= n; i++) {
        cnt = cnt + setBits[i];
    }
  
    return cnt;
}
  
// Driver code
int main()
{
    int n = 6;
  
    cout << countSetBits(n);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach
import java.util.*;
  
class GFG
{
  
// Function to return the count of
// set bits in all the integers
// from the range [1, n]
static int countSetBits(int n)
{
  
    // To store the required count
    // of the set bits
    int cnt = 0;
  
    // To store the count of set
    // bits in every integer
    int []setBits = new int[n + 1];
  
    // 0 has no set bit
    setBits[0] = 0;
  
    // 1 has a single set bit
    setBits[1] = 1;
  
    // For the rest of the elements
    for (int i = 2; i <= n; i++) 
    {
  
        // If current element i is even then
        // it has set bits equal to the count
        // of the set bits in i / 2
        if (i % 2 == 0
        {
            setBits[i] = setBits[i / 2];
        }
  
        // Else it has set bits equal to one
        // more than the previous element
        else
        {
            setBits[i] = setBits[i - 1] + 1;
        }
    }
  
    // Sum all the set bits
    for (int i = 0; i <= n; i++) 
    {
        cnt = cnt + setBits[i];
    }
    return cnt;
}
  
// Driver code
public static void main(String[] args) 
{
    int n = 6;
  
    System.out.println(countSetBits(n));
}
}
  
// This code is contributed by Princi Singh

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the approach 
using System;
  
class GFG
{
      
    // Function to return the count of 
    // set bits in all the integers 
    // from the range [1, n] 
    static int countSetBits(int n) 
    
      
        // To store the required count 
        // of the set bits 
        int cnt = 0; 
      
        // To store the count of set 
        // bits in every integer 
        int []setBits = new int[n + 1]; 
      
        // 0 has no set bit 
        setBits[0] = 0; 
      
        // 1 has a single set bit 
        setBits[1] = 1; 
      
        // For the rest of the elements 
        for (int i = 2; i <= n; i++) 
        
      
            // If current element i is even then 
            // it has set bits equal to the count 
            // of the set bits in i / 2 
            if (i % 2 == 0) 
            
                setBits[i] = setBits[i / 2]; 
            
      
            // Else it has set bits equal to one 
            // more than the previous element 
            else
            
                setBits[i] = setBits[i - 1] + 1; 
            
        
      
        // Sum all the set bits 
        for (int i = 0; i <= n; i++) 
        
            cnt = cnt + setBits[i]; 
        
        return cnt; 
    
      
    // Driver code 
    static public void Main () 
    
        int n = 6; 
      
        Console.WriteLine(countSetBits(n)); 
    
  
// This code is contributed by AnkitRai01 

chevron_right


Output:

9


My Personal Notes arrow_drop_up

Recommended Posts: