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
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.
// 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 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 |
# 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# 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 |
<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> |
Modified x is 15
Time Complexity: O(r)
Auxiliary Space: O(1)
Method 2 (Copy all bits using one bit mask)
// 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 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 |
# 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# 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 |
<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> |
Modified x is 14
Time Complexity: O(1)
Auxiliary Space: O(1)
Thanks to Ashish Rathi for suggesting this solution in a comment.