Open In App

Powers of 2 to required sum using Bit Masking

Improve
Improve
Like Article
Like
Save
Share
Report

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++




// 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;
}


Java




// 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


Python3




# 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


C#




// 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


Javascript




<script>
 
// Javascript 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
function PowerOfTwo(N)
{
    for (var i = 0; i < 64; i++) {
        var 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 * Math.pow(2,i))) >0)
            document.write( i + " ");
    }
}
 
// Driver Code
var N = 12345;
PowerOfTwo(N);
 
// This code is contributed by importantly.
</script>


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
 



Last Updated : 03 Jun, 2021
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads