Powers of 2 to required sum using Bit Masking - GeeksforGeeks

03 Jun, 2021
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^13Input: 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++
Java
Python3
C#
Javascript
// 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 Nvoid 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 Codeint main(){     long long N = 12345;    PowerOfTwo(N);     return 0;}
// Java Program to split N// into numbers which when// added after being raised// to the power of 2 gives Nclass GFG{ // Function to print the numbers// which raised to power of 2// adds up to Nstatic 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 Codepublic static void main(String[] args){    long N = 12345;    PowerOfTwo(N);}} // This code is contributed by Amit Katiyar
# 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 Ndef 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 Codeif __name__ == "__main__":         # Given number    N = 12345;     # Function call    PowerOfTwo(N) # This code is contributed by rock_cool
// C# Program to split N// into numbers which when// added after being raised// to the power of 2 gives Nusing System;class GFG{ // Function to print the numbers// which raised to power of 2// adds up to Nstatic 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 Codepublic static void Main(){    long N = 12345;    PowerOfTwo(N);}} // This code is contributed by Nidhi_biet
<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 Nfunction 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 Codevar N = 12345;PowerOfTwo(N); // This code is contributed by importantly.</script>
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 
amit143katiyar
nidhi_biet
rock_cool
importantly
Bit Algorithms
maths-power
Bit Magic
Combinatorial
Bit Magic
Combinatorial
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Little and Big Endian Mystery
Cyclic Redundancy Check and Modulo-2 Division
Binary representation of a given number
Add two numbers without using arithmetic operators
Josephus problem | Set 1 (A O(n) Solution)
Write a program to print all permutations of a given string
Permutation and Combination in Python
itertools.combinations() module in Python to print all possible combinations
Combinational Sum
Factorial of a large number