Copy set bits in a range
Last Updated :
16 Jun, 2022
Improve
Try it on GfG Practice
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>
Output
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>
Output
Modified x is 14
Time Complexity: O(1)
Auxiliary Space: O(1)
Thanks to Ashish Rathi for suggesting this solution in a comment.