Sum of numbers with exactly 2 bits set

3.5

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

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.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

GATE CS Corner    Company Wise Coding Practice

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.

Recommended Posts:



3.5 Average Difficulty : 3.5/5.0
Based on 2 vote(s)










Writing code in comment? Please use ide.geeksforgeeks.org, generate link and share the link here.