Powers of 2 to required sum

26 May, 2022
Given an integer N, task is to find the numbers which when raised to the power of 2 and added finally, gives the integer N.
Example : 
Input : 71307
Output : 0, 1, 3, 7, 9, 10, 12, 16
Explanation :
71307 = 2^0 + 2^1 + 2^3 + 2^7 +
        2^9 + 2^10 + 2^12 + 2^16

Input : 1213
Output : 0, 2, 3, 4, 5, 7, 10
Explanation : 
1213 = 2^0 + 2^2 + 2^3 + 2^4 + 
       2^5 + 2^7 + 2^10
Approach : Every number can be described in powers of 2. Example : 29 = 2^0 + 2^2 + 2^3 + 2^4.2^0 ( exponent of 2 is ‘0’) 0 2^2 ( exponent of 2 is ‘2’) 1 2^3 ( exponent of 2 is ‘3’) 3 2^4 ( exponent of 2 is ‘4’) 4Convert each number into its binary equivalent by pushing remainder of given number, when divided by 2 till it is greater than 0, to vector. Now, Iterate through its binary equivalent and whenever there is set bit, just print the i-th value(iteration number). 
Application : Hamming Code : Hamming Code is an error correcting code which can detect and correct one bit error. This pattern is also used in Hamming code error detection where parity bits store the XOR of numbers on the basis of LSB(Least Significant bit), where numbers are assigned in blocks and you need to find the blocks where the sum of power of 2 resulting to given number exists.
Below is the image to show the blocks with given numbers.  
Chapters
descriptions off, selected
captions settings, opens captions settings dialog
captions off, selected
English
default, selected
This is a modal window.
Beginning of dialog window. Escape will cancel and close the window.
End of dialog window.
Below is the implementation of above approach : 
C++
Java
Python3
C#
PHP
Javascript
// CPP program to find the// blocks for given number.#include <bits/stdc++.h>using namespace std; void block(long int x){    vector<long int> v;         // Converting the decimal number    // into its binary equivalent.    cout << "Blocks for " << x << " : ";    while (x > 0)    {        v.push_back(x % 2);        x = x / 2;    }     // Displaying the output when    // the bit is '1' in binary    // equivalent of number.    for (int i = 0; i < v.size(); i++)    {        if (v[i] == 1)        {            cout << i;            if (i != v.size() - 1)                cout << ", ";        }    }    cout << endl;} // Driver Functionint main(){    block(71307);    block(1213);    block(29);    block(100);    return 0;}
// Java program to find the// blocks for given number.import java.util.*; class GFG { static void block(long x){    ArrayList<Integer> v = new ArrayList<Integer>();         // Convert decimal number to    // its binary equivalent    System.out.print("Blocks for "+x+" : ");    while (x > 0)    {        v.add((int)x % 2);        x = x / 2;    }     // Displaying the output when    // the bit is '1' in binary    // equivalent of number.    for (int i = 0; i < v.size(); i++)    {        if (v.get(i) == 1)        {        System.out.print(i);            if (i != v.size() - 1)            System.out.print( ", ");        }    }System.out.println();} // Driver Codepublic static void main(String args[]){    block(71307);    block(1213);    block(29);    block(100);}} // This code is contributed by Arnab Kundu.
# Python3 program to find the# blocks for given number.def block(x):         v = []         # Converting the decimal number    # into its binary equivalent.    print ("Blocks for %d : " %x, end="")    while (x > 0):        v.append(int(x % 2))        x = int(x / 2)     # Displaying the output when    # the bit is '1' in binary    # equivalent of number.    for i in range(0, len(v)):        if (v[i] == 1):            print (i, end = "")            if (i != len(v) - 1):                print (", ", end = "")    print ("\n") block(71307)block(1213)block(29)block(100) # This code is contributed by Manish# Shaw (manishshaw1)
// C# program to find the// blocks for given number.using System;using System.Collections.Generic; class GFG {     static void block(long x)    {        List<int> v = new List<int>();             // Convert decimal number to        // its binary equivalent        Console.Write("Blocks for " + x + " : ");                 while (x > 0)        {            v.Add((int)x % 2);            x = x / 2;        }             // Displaying the output when        // the bit is '1' in binary        // equivalent of number.        for (int i = 0; i < v.Count; i++)        {            if (v[i] == 1)            {                Console.Write(i);                                 if (i != v.Count - 1)                    Console.Write(", ");            }        }             Console.WriteLine();    }         // Driver Code here    public static void Main()    {        block(71307);        block(1213);        block(29);        block(100);    }} // This code is contributed by Ajit.
<?php// PHP program to find the// blocks for given number. function block($x){    $v = array();     // Convert decimal number to    // its binary equivalent    echo 'Blocks for ' .$x.' : ';         while ($x > 0)    {        array_push($v,intval($x % 2));        $x = intval($x / 2);    }     // Displaying the output when    // the bit is '1' in binary    // equivalent of number.    for ($i = 0; $i < sizeof($v); $i++)    {        if ($v[$i] == 1)        {            print $i;                         if ($i != sizeof($v) - 1)                echo ', ';        }    }     echo "\n";} // Driver Codeblock(71307);block(1213);block(29);block(100); // This code is contributed// by Manish Shaw (manishshaw1)?>
<script> // Javascript program to find the// blocks for given number.function block(x){    let v = [];       // Convert decimal number to    // its binary equivalent    document.write("Blocks for " + x + " : ");           while (x > 0)    {        v.push(x % 2);        x = parseInt(x / 2, 10);    }       // Displaying the output when    // the bit is '1' in binary    // equivalent of number.    for(let i = 0; i < v.length; i++)    {        if (v[i] == 1)        {            document.write(i);                           if (i != v.length - 1)                document.write(", ");        }    }    document.write("</br>");} // Driver codeblock(71307);block(1213);block(29);block(100); // This code is contributed by mukesh07 </script>
Blocks for 71307 : 0, 1, 3, 7, 9, 10, 12, 16
Blocks for 1213 : 0, 2, 3, 4, 5, 7, 10
Blocks for 29 : 0, 2, 3, 4
Blocks for 100 : 2, 5, 6
 
Time Complexity: O(log2n)
Auxiliary Space: O(log2n)
Powers of 2 to required sum | GeeksforGeeks - YouTubeGeeksforGeeks529K subscribersPowers of 2 to required sum | GeeksforGeeksWatch laterShareCopy linkInfoShoppingTap to unmuteIf playback doesn't begin shortly, try restarting your device.More videosMore videosYou're signed outVideos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer.CancelConfirmSwitch cameraShareInclude playlistAn error occurred while retrieving sharing information. Please try again later.Watch on0:000:000:00 / 2:50•Live•<div class="player-unavailable"><h1 class="message">An error occurred.</h1><div class="submessage"><a href="https://www.youtube.com/watch?v=XMrV93KSgKk" target="_blank">Try watching this video on www.youtube.com</a>, or enable JavaScript if it is disabled in your browser.</div></div>
andrew1234
jit_t
manishshaw1
saumyaagnihotri
mukesh07
ranjanrohit840
Bit Algorithms
cpp-vector
Bit Magic
Mathematical
Technical Scripter
Mathematical
Bit Magic
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Little and Big Endian Mystery
Bits manipulation (Important tactics)
Binary representation of a given number
Josephus problem | Set 1 (A O(n) Solution)
Bit Fields in C
Program for Fibonacci numbers
Set in C++ Standard Template Library (STL)
Write a program to print all permutations of a given string
C++ Data Types
Merge two sorted arrays