Powers of 2 to required sum using Bit Masking

Given an integer N, the task is to find the numbers which when added after being raised to the Power of 2 gives the integer N.

Examples:

Input: N = 12345
Output: 0, 3, 4, 5, 12, 13
Explanation:
12345 = 2^0 + 2^3 + 2^4 + 2^5 + 2^12 + 2^13

Input: N = 10000
Output: 4, 8, 9, 10, 13
Explanation:
10000 = 2^4 + 2^8 + 2^9 + 2^10 + 2^13

Approach:



  • Since every number can be expressed as sum of powers of 2, the task is to print every i when ith bit is set in the binary representation of N.
  • Illustration:
    (29)10 = (11101)2
    Thus, in 29, {0, 2, 3, 4} are the indices of the set bits.
    20 + 22 + 23 + 24
    = 1 + 4 + 8 + 16
    = 29

  • In order to check if ith bit is set, we only need to check:

    if( N & (1 << i) ) == 1
    Illustration:
    (29)10 = (11101)2
    0th bit: 11101 & 1 = 1
    1st bit: 11101 & 10 = 0
    2nd bit: 11101 & 100 = 1
    3rd bit: 11101 & 1000 = 1
    4th bit: 11101 & 10000 = 1

Below is the implementation of the above approach.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ Program to split N
// into numbers which when
// added after being raised
// to the power of 2 gives N
  
#include <bits/stdc++.h>
using namespace std;
  
// Function to print the numbers
// which raised to power of 2
// adds up to N
void PowerOfTwo(long long N)
{
    for (int i = 0; i < 64; i++) {
        long long x = 1;
  
        // Checking if i-th bit is
        // set in N or not by
        // shifting 1 i bits to
        // the left and performing
        // AND with N
        if (N & (x << i))
            cout << i << " ";
    }
}
  
// Driver Code
int main()
{
  
    long long N = 12345;
    PowerOfTwo(N);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java Program to split N
// into numbers which when
// added after being raised
// to the power of 2 gives N
class GFG{
  
// Function to print the numbers
// which raised to power of 2
// adds up to N
static void PowerOfTwo(long N)
{
    for (int i = 0; i < 64; i++) 
    {
        long x = 1;
  
        // Checking if i-th bit is
        // set in N or not by
        // shifting 1 i bits to
        // the left and performing
        // AND with N
        if ((N & (x << i)) > 0)
            System.out.print(i + " ");
    }
}
  
// Driver Code
public static void main(String[] args)
{
    long N = 12345;
    PowerOfTwo(N);
}
}
  
// This code is contributed by Amit Katiyar

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to split N
# into numbers which when
# added after being raised
# to the power of 2 gives N
  
# Function to print the numbers
# which raised to power of 2
# adds up to N
def PowerOfTwo(N):
  
    for i in range(0, 64): 
        x = 1
          
        # Checking if i-th bit is
        # set in N or not by
        # shifting 1 i bits to
        # the left and performing
        # AND with N
        if (N & (x << i)) > 0:
            print(i, end = " ")
          
# Driver Code 
if __name__ == "__main__"
      
    # Given number
    N = 12345;
  
    # Function call
    PowerOfTwo(N)
  
# This code is contributed by rock_cool

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# Program to split N
// into numbers which when
// added after being raised
// to the power of 2 gives N
using System;
class GFG{
  
// Function to print the numbers
// which raised to power of 2
// adds up to N
static void PowerOfTwo(long N)
{
    for (int i = 0; i < 64; i++) 
    {
        long x = 1;
  
        // Checking if i-th bit is
        // set in N or not by
        // shifting 1 i bits to
        // the left and performing
        // AND with N
        if ((N & (x << i)) > 0)
            Console.Write(i + " ");
    }
}
  
// Driver Code
public static void Main()
{
    long N = 12345;
    PowerOfTwo(N);
}
}
  
// This code is contributed by Nidhi_biet

chevron_right


Output:

0 3 4 5 12 13

Time Complexity: O(log N)
Space Complexity: O(1)

For an alternative approach, refer to Powers of 2 to required sum

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

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 Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.