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 = 4Input: 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 is 0.
- For any number n: n and n>>1 has same no of set bits except for the rightmost bit.
Example: n = 11 (1011), n >> 1 = 5 (101)… same bits in 11 and 5 are marked bold. So assuming we already know set bit count of 5, we only need to take care for the rightmost bit of 11 which is 1. setBit(11) = setBit(5) + 1 = 2 + 1 = 3
Rightmost bit is 1 for odd and 0 for even number.
Recurrence Relation: setBit(n) = setBit(n>>1) + (n & 1) and setBit(0) = 0
We can use bottom-up dynamic programming approach to solve this.
Below is the implementation of the above approach:
9
Time Complexity: O(N), where N is the given number.
Auxiliary Space: O(N), for creating an additional array of size N + 1.
Another simple and easy-to-understand solution:
A simple easy to implement and understand solution would be not using bits operations. The solution is to directly count set bits using __builtin_popcount(). The solution is explained in code using comments.
// 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;
// Calculate set bits in each number using
// __builtin_popcount() and Sum all the set bits
for ( int i = 1; i <= n; i++) {
cnt = cnt + __builtin_popcount(i);
}
return cnt;
} // Driver code int main()
{ int n = 6;
cout << countSetBits(n);
return 0;
} // This article is contributed by Abhishek |
// 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 ;
// Calculate set bits in each number using
// Integer.bitCount() and Sum all the set bits
for ( int i = 1 ; i <= n; i++) {
cnt = cnt + Integer.bitCount(i);
}
return cnt;
}
// Driver code
public static void main(String[] args)
{
int n = 6 ;
System.out.print(countSetBits(n));
}
} // This code is contributed by Rajput-Ji |
# Python implementation of the approach # Function to return the count of # set bits in all the integers # from the range [1, n] def countSetBits(n):
# To store the required count
# of the set bits
cnt = 0
# Calculate set bits in each number using
# Integer.bitCount() and Sum all the set bits
for i in range ( 1 , n + 1 ):
cnt = cnt + ( bin (i)[ 2 :]).count( '1' )
return cnt
# Driver code if __name__ = = '__main__' :
n = 6
print (countSetBits(n))
# This code is contributed by Rajput-Ji |
<script> // javascript implementation of the approach function bitCount (n) {
n = n - ((n >> 1) & 0x55555555)
n = (n & 0x33333333) + ((n >> 2) & 0x33333333)
return ((n + (n >> 4) & 0xF0F0F0F) * 0x1010101) >> 24
} // Function to return the count of
// set bits in all the integers
// from the range [1, n]
function countSetBits(n) {
// To store the required count
// of the set bits
var cnt = 0;
// Calculate set bits in each number using
// Integer.bitCount() and Sum all the set bits
for (i = 1; i <= n; i++) {
cnt = cnt + bitCount(i);
}
return cnt;
}
// Driver code
var n = 6;
document.write(countSetBits(n));
// This code is contributed by Rajput-Ji </script> |
// C# implementation of the approach using System;
using System.Linq;
public 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;
// Calculate set bits in each number using
// int.bitCount() and Sum all the set bits
for ( int i = 1; i <= n; i++) {
cnt = cnt
+ (Convert.ToString(i, 2).Count(
c = > c == '1' ));
}
return cnt;
}
// Driver code
public static void Main(String[] args)
{
int n = 6;
Console.Write(countSetBits(n));
}
} // This code is contributed by Rajput-Ji |
9
Time Complexity: O(NlogN), where N is the given number.
Auxiliary Space: O(1)
Another approach : Space optimized without use of built-in function
To optimize the space of the previous approach we can avoid using a vector to store the set bits count for every integer in the range [1, n]. Instead, we can use a single variable to store the total count of set bits.
Implementation Steps:
- Initialize a variable ‘cnt’ to 0.
- Iterate from 1 to n.
- For each i, create a variable ‘x’ and set it to i.
- While x is greater than 0, do the following:
- a. If the least significant bit of x is 1, increment ‘cnt’.
- b. Right shift x by 1 bit.
- Return cnt as the count of set bits in integers from 1 to n.
Implementation:
// 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;
for ( int i = 1; i <= n; i++) {
int x = i;
while (x > 0) {
cnt += (x & 1);
x >>= 1;
}
}
return cnt;
} // Driver code int main()
{ int n = 6;
cout << countSetBits(n);
return 0;
} |
// Java code addition import java.util.*;
public class Main {
// Function to return the count of
// set bits in all the integers
// from the range [1, n]
public static int countSetBits( int n)
{
// To store the required count
// of the set bits
int cnt = 0 ;
for ( int i = 1 ; i <= n; i++) {
int x = i;
while (x > 0 ) {
cnt += (x & 1 );
x >>= 1 ;
}
}
return cnt;
}
// Driver code
public static void main(String[] args) {
int n = 6 ;
System.out.println(countSetBits(n));
}
} // The code is contributed by Nidhi goel. |
// JavaScript code to return the count of set bits in all the integers from the range [1, n] function countSetBits(n) {
// To store the required count of the set bits
let cnt = 0;
for (let i = 1; i <= n; i++) {
let x = i;
while (x > 0) {
cnt += (x & 1);
x >>= 1;
}
}
return cnt;
} // Driver code let n = 6; console.log(countSetBits(n)); |
using System;
class GFG {
// Function to return the count of
// set bits in all the integers
// from the range [1, n]
public static int CountSetBits( int n)
{
// To store the required count
// of the set bits
int cnt = 0;
for ( int i = 1; i <= n; i++) {
int x = i;
while (x > 0) {
cnt += (x & 1);
x >>= 1;
}
}
return cnt;
}
// Driver code
public static void Main( string [] args)
{
int n = 6;
Console.WriteLine(CountSetBits(n));
}
} |
Output
9
Time Complexity: O(NlogN), where N is the given number.
Auxiliary Space: O(1)