Wednesday, July 3, 2024
HomeData ModellingData Structure & AlgorithmPowers of 2 to required sum using Bit Masking

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




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

Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

Thapelo Manthata
I’m a desktop support specialist transitioning into a SharePoint developer role by day and Software Engineering student by night. My superpowers include customer service, coding, the Microsoft office 365 suite including SharePoint and power platform.
RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments