Related Articles
Calculate the number of set bits for every number from 0 to N
• Last Updated : 03 Mar, 2020

Given a non-negative integer N, the task is to find the count of set bits for every number from 0 to N.

Examples:

Input: N = 3
Output: 0 1 1 2
0, 1, 2 and 3 can be written in binary as 0, 1, 10 and 11.
The number of 1’s in their binary representation are 0, 1, 1 and 2.

Input: N = 5
Output: 0 1 1 2 1 2

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Naive approach: Run a loop from 0 to N and using inbuilt bit count function __builtin_popcount(), find the number of set bits in all the required integers.

Below is the implementation of the above approach:

## C++

 `// C++ implementation of the approach``#include ``using` `namespace` `std;`` ` `// Function to find the count``// of set bits in all the``// integers from 0 to n``void` `findSetBits(``int` `n)``{``    ``for` `(``int` `i = 0; i <= n; i++)``        ``cout << __builtin_popcount(i) << ``" "``;``}`` ` `// Driver code``int` `main()``{``    ``int` `n = 5;`` ` `    ``findSetBits(n);`` ` `    ``return` `0;``}`

## Java

 `// Java implementation of the approach``class` `GFG ``{`` ` `// Function to find the count``// of set bits in all the``// integers from 0 to n``static` `void` `findSetBits(``int` `n)``{``    ``for` `(``int` `i = ``0``; i <= n; i++)``        ``System.out.print(Integer.bitCount(i) + ``" "``);``}`` ` `// Driver code``public` `static` `void` `main(String[] args) ``{``    ``int` `n = ``5``;`` ` `    ``findSetBits(n);``}``}`` ` `// This code is contributed by Rajput-Ji`

## Python 3

 `# Python 3 implementation of the approach``def` `count(n):``    ``count ``=` `0``    ``while` `(n): ``        ``count ``+``=` `n & ``1``        ``n >>``=` `1``    ``return` `count`` ` `# Function to find the count``# of set bits in all the``# integers from 0 to n``def` `findSetBits(n):``    ``for` `i ``in` `range``(n ``+` `1``):``        ``print``(count(i), end ``=` `" "``)``     ` `# Driver code``if` `__name__ ``=``=` `'__main__'``:``    ``n ``=` `5`` ` `    ``findSetBits(n)`` ` `# This code is contributed by Surendra_Gangwar`

## C#

 `// C# implementation of the approach ``using` `System; ``     ` `class` `GFG ``{ `` ` `static` `int` `count(``int` `n) ``    ``{ ``        ``int` `count = 0; ``        ``while` `(n > 0)``        ``{ ``            ``count += n & 1; ``            ``n >>= 1; ``        ``} ``        ``return` `count; ``    ``} ``     ` `// Function to find the count ``// of set bits in all the ``// integers from 0 to n ``static` `void` `findSetBits(``int` `n) ``{ ``    ``for` `(``int` `i = 0; i <= n; i++) ``        ``Console.Write(count(i)+``" "``); ``} `` ` `// Driver code ``public` `static` `void` `Main(String []args)``{ ``    ``int` `n = 5; `` ` `    ``findSetBits(n); ``} ``}`` ` `// This code is contributed by SHUBHAMSINGH10 `
Output:
```0 1 1 2 1 2
```

Efficient approach: Let us write the binary representation of numbers in the range (0, 6).

0 in binary – 000
1 in binary – 001
2 in binary – 010
3 in binary – 011
4 in binary – 100
5 in binary – 101
6 in binary – 110

Since, any even number can be written as (2 * i) and any odd number can be written as (2 * i + 1) where i is a natural number.
2, 4 and 3, 6 have equal number of 1’s in their binary representation as multiplying any number is equivalent to shifting it left by 1 (read here).
Similarly, any even number 2 * i and i will have equal number of 1’s in its binary representation.
Number of 1’s in 5(101) is equal to number of 1’s in 2’s binary representation + 1. So in case of any odd number (2 * i + 1), it will be (number of 1’s in the binary representation of i) + 1.

Below is the implementation of the above approach:

## C++

 `// C++ implementation of the approach``#include ``using` `namespace` `std;`` ` `// Function to find the count``// of set bits in all the``// integers from 0 to n``void` `findSetBits(``int` `n)``{`` ` `    ``// dp[i] will store the count``    ``// of set bits in i``    ``int` `dp[n + 1];`` ` `    ``// Initialise the dp array``    ``memset``(dp, 0, ``sizeof``(dp));`` ` `    ``// Count of set bits in 0 is 0``    ``cout << dp << ``" "``;`` ` `    ``// For every number starting from 1``    ``for` `(``int` `i = 1; i <= n; i++) {`` ` `        ``// If current number is even``        ``if` `(i % 2 == 0) {`` ` `            ``// Count of set bits in i is equal to``            ``// the count of set bits in (i / 2)``            ``dp[i] = dp[i / 2];``        ``}`` ` `        ``// If current element is odd``        ``else` `{`` ` `            ``// Count of set bits in i is equal to``            ``// the count of set bits in (i / 2) + 1``            ``dp[i] = dp[i / 2] + 1;``        ``}`` ` `        ``// Print the count of set bits in i``        ``cout << dp[i] << ``" "``;``    ``}``}`` ` `// Driver code``int` `main()``{``    ``int` `n = 5;`` ` `    ``findSetBits(n);`` ` `    ``return` `0;``}`

## Java

 `// Java implementation of the approach``class` `GFG``{`` ` `// Function to find the count``// of set bits in all the``// integers from 0 to n``static` `void` `findSetBits(``int` `n)``{`` ` `    ``// dp[i] will store the count``    ``// of set bits in i``    ``int` `[]dp = ``new` `int``[n + ``1``];`` ` `    ``// Count of set bits in 0 is 0``    ``System.out.print(dp[``0``] + ``" "``);`` ` `    ``// For every number starting from 1``    ``for` `(``int` `i = ``1``; i <= n; i++) ``    ``{`` ` `        ``// If current number is even``        ``if` `(i % ``2` `== ``0``) ``        ``{`` ` `            ``// Count of set bits in i is equal to``            ``// the count of set bits in (i / 2)``            ``dp[i] = dp[i / ``2``];``        ``}`` ` `        ``// If current element is odd``        ``else``        ``{`` ` `            ``// Count of set bits in i is equal to``            ``// the count of set bits in (i / 2) + 1``            ``dp[i] = dp[i / ``2``] + ``1``;``        ``}`` ` `        ``// Print the count of set bits in i``        ``System.out.print(dp[i] + ``" "``);``    ``}``}`` ` `// Driver code``public` `static` `void` `main(String []args)``{``    ``int` `n = ``5``;`` ` `    ``findSetBits(n);``}``}`` ` `// This code is contributed by Rajput-Ji`

## Python3

 `# Python3 implementation of the approach `` ` `# Function to find the count of set bits ``# in all the integers from 0 to n ``def` `findSetBits(n) :`` ` `    ``# dp[i] will store the count ``    ``# of set bits in i ``    ``# Initialise the dp array``    ``dp ``=` `[``0``] ``*` `(n ``+` `1``); ``     ` `    ``# Count of set bits in 0 is 0 ``    ``print``(dp[``0``], end ``=` `" "``); `` ` `    ``# For every number starting from 1 ``    ``for` `i ``in` `range``(``1``, n ``+` `1``) :`` ` `        ``# If current number is even ``        ``if` `(i ``%` `2` `=``=` `0``) :`` ` `            ``# Count of set bits in i is equal to ``            ``# the count of set bits in (i / 2) ``            ``dp[i] ``=` `dp[i ``/``/` `2``]; `` ` `        ``# If current element is odd ``        ``else` `:`` ` `            ``# Count of set bits in i is equal to ``            ``# the count of set bits in (i / 2) + 1 ``            ``dp[i] ``=` `dp[i ``/``/` `2``] ``+` `1``; `` ` `        ``# Print the count of set bits in i ``        ``print``(dp[i], end ``=` `" "``); `` ` `# Driver code ``if` `__name__ ``=``=` `"__main__"` `: `` ` `    ``n ``=` `5``; `` ` `    ``findSetBits(n); `` ` `# This code is contributed by AnkitRai01`

## C#

 `// C# implementation of the approach``using` `System;``     ` `class` `GFG``{`` ` `// Function to find the count``// of set bits in all the``// integers from 0 to n``static` `void` `findSetBits(``int` `n)``{`` ` `    ``// dp[i] will store the count``    ``// of set bits in i``    ``int` `[]dp = ``new` `int``[n + 1];`` ` `    ``// Count of set bits in 0 is 0``    ``Console.Write(dp + ``" "``);`` ` `    ``// For every number starting from 1``    ``for` `(``int` `i = 1; i <= n; i++) ``    ``{`` ` `        ``// If current number is even``        ``if` `(i % 2 == 0) ``        ``{`` ` `            ``// Count of set bits in i is equal to``            ``// the count of set bits in (i / 2)``            ``dp[i] = dp[i / 2];``        ``}`` ` `        ``// If current element is odd``        ``else``        ``{`` ` `            ``// Count of set bits in i is equal to``            ``// the count of set bits in (i / 2) + 1``            ``dp[i] = dp[i / 2] + 1;``        ``}`` ` `        ``// Print the count of set bits in i``        ``Console.Write(dp[i] + ``" "``);``    ``}``}`` ` `// Driver code``public` `static` `void` `Main(String []args)``{``    ``int` `n = 5;`` ` `    ``findSetBits(n);``}``}`` ` `// This code is contributed by 29AjayKumar`
Output:
```0 1 1 2 1 2
```

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up