# Sum of numbers with exactly 2 bits set

Given a number n. Find sum of all number upto n whose 2 bits are set.

Examples:

```Input : 10
Output : 33
3 + 5 + 6 + 9 + 10 = 33

Input : 100
Output : 762
```

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

Naive Approach: Find each number upto n whose 2 bits are set. If its 2 bits are set add it to the sum.

## C++

```// CPP program to find sum of numbers
// upto n whose 2 bits are set
#include <bits/stdc++.h>
using namespace std;

// To count number of set bits
int countSetBits(int n)
{
int count = 0;
while (n) {
n &= (n - 1);
count++;
}
return count;
}

// To calculate sum of numbers
int findSum(int n)
{
int sum = 0;

// To count sum of number
// whose 2 bit are set
for (int i = 1; i <= n; i++)
if (countSetBits(i) == 2)
sum += i;

return sum;
}

// Driver program to test above function
int main()
{
int n = 10;
cout << findSum(n);
return 0;
}
```

## Java

```// Java program to find sum of numbers
// upto n whose 2 bits are set
public class Main {

// To count number of set bits
static int countSetBits(int n)
{
int count = 0;
while (n >= 0) {
n &= (n - 1);
count++;
}
return count;
}

// To calculate sum of numbers
static int findSum(int n)
{
int sum = 0;

// To count sum of number
// whose 2 bit are set
for (int i = 1; i <= n; i++)
if (countSetBits(i) == 2)
sum += i;

return sum;
}

// Driver program to test above function
public static void main(String[] args)
{
int n = 10;

System.out.println(findSum(n));
}
}
```

Output:

```33
```

Efficient Approach: The number whose 2 bits are set is of the form 2^x + 2^y and this number is less then n. So we have to find only numbers in the range upto n which is of form 2^i + 2^j where i > 0 and 2^i < n and 0 <= j < i.

## C++

```// CPP program to find sum of numbers
// upto n whose 2 bits are set
#include <bits/stdc++.h>
using namespace std;

// To calculate sum of numbers
int findSum(int n)
{
int sum = 0;

// Find numbers whose 2 bits are set
for (int i = 1; (1 << i) < n; i++) {
for (int j = 0; j < i; j++) {
int num = (1 << i) + (1 << j);

// If number is greater then n
// we don't include this in sum
if (num <= n)
sum += num;
}
}

// Return sum of numbers
return sum;
}

// Driver program to test findSum()
int main()
{
int n = 10;
cout << findSum(n);
return 0;
}
```

## Java

```// Java program to find sum of numbers
// upto n whose 2 bits are set
public class Main {

// To calculate sum of numbers
static int findSum(int n)
{
int sum = 0;

// Find numbers whose 2 bits are set
for (int i = 1; 1 << i < n; i++) {
for (int j = 0; j < i; j++) {
int num = (1 << i) + (1 << j);

// If number is greater then n
// we don't include this in sum
if (num <= n)
sum += num;
}
}

// Return sum of numbers
return sum;
}

// Driver program to test findSum()
public static void main(String[] args)
{
int n = 10;
System.out.println(findSum(n));
}
}
```

Output:

```33
```

This article is contributed by nuclode. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

# GATE CS Corner    Company Wise Coding Practice

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.
3.5 Average Difficulty : 3.5/5.0
Based on 2 vote(s)