Open In App

Copy set bits in a range

Improve
Improve
Like Article
Like
Save
Share
Report

Given two numbers x and y, and a range [l, r] where 1 <= l, r <= 32. The task is consider set bits of y in range [l, r] and set these bits in x also.
Examples : 

Input  : x = 10, y = 13, l = 2, r = 3
Output : x = 14
Binary representation of 10 is 1010 and 
that of y is 1101. There is one set bit
in y at 3'rd position (in given range). 
After we copy this bit to x, x becomes 1110
which is binary representation of 14.

Input  : x = 8, y = 7, l = 1, r = 2
Output : x = 11

Source : D E Shaw Interview
 

Recommended Practice

Method 1 (One by one copy bits) 
We can one by one find set bits of y by traversing given range. For every set bit, we OR it to existing bit of x, so that the becomes set in x, if it was not set. Below is C++ implementation.
 

CPP




// C++ program to rearrange array in alternating
// C++ program to copy set bits in a given
// range [l, r] from y to x.
#include <bits/stdc++.h>
using namespace std;
 
// Copy set bits in range [l, r] from y to x.
// Note that x is passed by reference and modified
// by this function.
void copySetBits(unsigned &x, unsigned y,
                 unsigned l, unsigned r)
{
   // l and r must be between 1 to 32
   // (assuming ints are stored using
   //  32 bits)
   if (l < 1 || r > 32)
      return ;
 
   // Traverse in given range
   for (int i=l; i<=r; i++)
   {
       // Find a mask (A number whose
       // only set bit is at i'th position)
       int mask = 1 << (i-1);
 
       // If i'th bit is set in y, set i'th
       // bit in x also.
       if (y & mask)
          x = x | mask;
   }
}
 
// Driver code
int main()
{
   unsigned x = 10, y = 13, l = 1, r = 32;
   copySetBits(x, y, l, r);
   cout << "Modified x is " << x;
   return 0;
}


Java




// Java program to rearrange array in alternating
// Java program to copy set bits in a given
// range [l, r] from y to x.
import java.util.*;
 
class GFG{
 
// Copy set bits in range [l, r] from y to x.
// Note that x is passed by reference and modified
// by this function.
static int copySetBits(int x, int y,
                 int l, int r)
{
   // l and r must be between 1 to 32
   // (assuming ints are stored using
   //  32 bits)
   if (l < 1 || r > 32)
      return x;
 
   // Traverse in given range
   for (int i = l; i <= r; i++)
   {
       // Find a mask (A number whose
       // only set bit is at i'th position)
       int mask = 1 << (i-1);
 
       // If i'th bit is set in y, set i'th
       // bit in x also.
       if ((y & mask)!=0)
          x = x | mask;
   }
    
   return x;
}
 
// Driver code
public static void main(String[] args)
{
   int x = 10, y = 13, l = 1, r = 32;
  x = copySetBits(x, y, l, r);
   System.out.print("Modified x is " +  x);
}
}
 
// This code is contributed by umadevi9616


Python3




# Python program to rearrange array in alternating
# Python program to copy set bits in a given
# range [l, r] from y to x.
 
# Copy set bits in range [l, r] from y to x.
# Note that x is passed by reference and modified
# by this function.
def copySetBits(x, y, l, r):
   
    # l and r must be between 1 to 32
    # (assuming ints are stored using
    # 32 bits)
    if (l < 1 or r > 32):
        return x;
 
    # Traverse in given range
    for i in range(l, r + 1):
       
        # Find a mask (A number whose
        # only set bit is at i'th position)
        mask = 1 << (i - 1);
 
        # If i'th bit is set in y, set i'th
        # bit in x also.
        if ((y & mask) != 0):
            x = x | mask;
    return x;
 
# Driver code
if __name__ == '__main__':
    x = 10;
    y = 13;
    l = 1;
    r = 32;
    x = copySetBits(x, y, l, r);
    print("Modified x is ", x);
 
# This code is contributed by gauravrajput1


C#




// C# program to rearrange array in alternating
// C# program to copy set bits in a given
// range [l, r] from y to x.
using System;
 
public class GFG {
 
    // Copy set bits in range [l, r] from y to x.
    // Note that x is passed by reference and modified
    // by this function.
    static int copySetBits(int x, int y, int l, int r)
    {
       
        // l and r must be between 1 to 32
        // (assuming ints are stored using
        // 32 bits)
        if (l < 1 || r > 32)
            return x;
 
        // Traverse in given range
        for (int i = l; i <= r; i++)
        {
           
            // Find a mask (A number whose
            // only set bit is at i'th position)
            int mask = 1 << (i - 1);
 
            // If i'th bit is set in y, set i'th
            // bit in x also.
            if ((y & mask) != 0)
                x = x | mask;
        }
 
        return x;
    }
 
    // Driver code
    public static void Main(String[] args) {
        int x = 10, y = 13, l = 1, r = 32;
        x = copySetBits(x, y, l, r);
        Console.Write("Modified x is " + x);
    }
}
 
// This code is contributed by umadevi9616


Javascript




<script>
// javascript program to rearrange array in alternating
// javascript program to copy set bits in a given
// range [l, r] from y to x.
 
    // Copy set bits in range [l, r] from y to x.
    // Note that x is passed by reference and modified
    // by this function.
    function copySetBits(x , y , l , r)
    {
     
        // l and r must be between 1 to 32
        // (assuming ints are stored using
        // 32 bits)
        if (l < 1 || r > 32)
            return x;
 
        // Traverse in given range
        for (i = l; i <= r; i++)
        {
         
            // Find a mask (A number whose
            // only set bit is at i'th position)
            var mask = 1 << (i - 1);
 
            // If i'th bit is set in y, set i'th
            // bit in x also.
            if ((y & mask) != 0)
                x = x | mask;
        }
 
        return x;
    }
 
    // Driver code
        var x = 10, y = 13, l = 1, r = 32;
        x = copySetBits(x, y, l, r);
        document.write("Modified x is " + x);
 
// This code is contributed by gauravrajput1
</script>


Output

Modified x is 15

Time Complexity: O(r)

Auxiliary Space: O(1)

 
Method 2 (Copy all bits using one bit mask)
 

CPP




// C++ program to copy set bits in a given
// range [l, r] from y to x.
#include <bits/stdc++.h>
using namespace std;
 
// Copy set bits in range [l, r] from y to x.
// Note that x is passed by reference and modified
// by this function.
void copySetBits(unsigned &x, unsigned y,
                 unsigned l, unsigned r)
{
    // l and r must be between 1 to 32
    if (l < 1 || r > 32)
        return ;
 
    // get the length of the mask
    int maskLength = (1ll<<(r-l+1)) - 1;
 
    // Shift the mask to the required position
    // "&" with y to get the set bits at between
    // l ad r in y
    int mask = ((maskLength)<<(l-1)) & y ;
    x = x | mask;
}
 
// Driver code
int main()
{
   unsigned x = 10, y = 13, l = 2, r = 3;
   copySetBits(x, y, l, r);
   cout << "Modified x is " << x;
   return 0;
}


Java




// Java program to copy set bits in a given
// range [l, r] from y to x.
import java.util.*;
 
class GFG{
 
// Copy set bits in range [l, r] from y to x.
// Note that x is passed by reference and modified
// by this function.
static int copySetBits(int x, int y,
                 int l, int r)
{
   
    // l and r must be between 1 to 32
    if (l < 1 || r > 32)
        return x;
 
    // get the length of the mask
    int maskLength = (int)((1L<<(r-l+1)) - 1);
 
    // Shift the mask to the required position
    // "&" with y to get the set bits at between
    // l ad r in y
    int mask = ((maskLength)<<(l-1)) & y ;
    x = x | mask;
    return x;
}
 
// Driver code
public static void main(String[] args)
{
   int x = 10, y = 13, l = 2, r = 3;
  x =  copySetBits(x, y, l, r);
   System.out.print("Modified x is " +  x);
}
}
 
// This code is contributed by umadevi9616


Python3




# Python program to copy set bits in a given
# range [l, r] from y to x.
 
# Copy set bits in range [l, r] from y to x.
# Note that x is passed by reference and modified
# by this function.
def copySetBits(x, y, l, r):
 
    # l and r must be between 1 to 32
    if (l < 1 or r > 32):
        return x;
 
    # get the length of the mask
    maskLength = (int) ((1 << (r - l + 1)) - 1);
 
    # Shift the mask to the required position
    # "&" with y to get the set bits at between
    # l ad r in y
    mask = ((maskLength) << (l - 1)) & y;
    x = x | mask;
    return x;
 
# Driver code
if __name__ == '__main__':
    x = 10;
    y = 13;
    l = 2;
    r = 3;
    x = copySetBits(x, y, l, r);
    print("Modified x is " , x);
 
# This code is contributed by gauravrajput1


C#




// C# program to copy set bits in a given
// range [l, r] from y to x.
using System;
 
public class GFG
{
 
    // Copy set bits in range [l, r] from y to x.
    // Note that x is passed by reference and modified
    // by this function.
    static int copySetBits(int x, int y, int l, int r) {
 
        // l and r must be between 1 to 32
        if (l < 1 || r > 32)
            return x;
 
        // get the length of the mask
        int maskLength = (int) ((1L << (r - l + 1)) - 1);
 
        // Shift the mask to the required position
        // "&" with y to get the set bits at between
        // l ad r in y
        int mask = ((maskLength) << (l - 1)) & y;
        x = x | mask;
        return x;
    }
 
    // Driver code
    public static void Main(String[] args) {
        int x = 10, y = 13, l = 2, r = 3;
        x = copySetBits(x, y, l, r);
        Console.Write("Modified x is " + x);
    }
}
 
// This code is contributed by gauravrajput1


Javascript




<script>
// javascript program to copy set bits in a given
// range [l, r] from y to x.
 
    // Copy set bits in range [l, r] from y to x.
    // Note that x is passed by reference and modified
    // by this function.
    function copySetBits(x , y , l , r) {
 
        // l and r must be between 1 to 32
        if (l < 1 || r > 32)
            return x;
 
        // get the length of the mask
        var maskLength = parseInt( ((1 << (r - l + 1)) - 1));
 
        // Shift the mask to the required position
        // "&" with y to get the set bits at between
        // l ad r in y
        var mask = ((maskLength) << (l - 1)) & y;
        x = x | mask;
        return x;
    }
 
    // Driver code
        var x = 10, y = 13, l = 2, r = 3;
        x = copySetBits(x, y, l, r);
        document.write("Modified x is " + x);
     
// This code is contributed by gauravrajput1
</script>


Output

Modified x is 14

Time Complexity: O(1)

Auxiliary Space: O(1)

Thanks to Ashish Rathi for suggesting this solution in a comment.

 



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