Two numbers: m and n are given. The size of these numbers is 32-bit long. You are also given two-bit positions: i and j. You have to set all bits between i and j in m equal to n, i.e., means that n becomes a substring of m located at i and starting at j.
Examples:
Input : m = 32, n = 7, i = 1, j = 3
Output : 46
Explanation : m (in binary) = 100000
n (in binary) = 000111
Set 1st bit to 3rd bit (both inclusive) of m equal to n
output (in binary) = 101110
Input : m = 1024, n = 21, i = 2, j = 6
Output : 1108
Approach:
- Create a mask of 1’s with 0’s between i and j (both inclusive).
- ANDing the mask with m.
- ORing with left-shifted (by i bits) n gives the output result.
Implementation in C++ :
#include <bits/stdc++.h>
using namespace std;
//function to set all bits between i and j in m equal to n
int bit_mask (int m, int n, int i, int j)
{
//All 1's
int max = ~0;
//1's through position j, then 0's
int left = max - ((1 << j) - 1);
//1's after position i
int right = (1 << i) - 1;
//1's, with 0's between i and j
int mask = left | right;
//Clear i through j, then put n in there
return (m & mask) | (n << i);
}
//Driver program
int main()
{
int m = 1024, n = 21, i = 2, j = 6;
cout << bit_mask (m, n, i, j);
return 0;
}
Output:
1108
Please write comments below if you find anything incorrect, or you want to share more information about the topic discussed above. A gentle request to share this topic on your social media profile.
