Inserting M into N such that m starts at bit j and ends at bit i | Set-2
Last Updated :
16 Nov, 2022
Given two 32-bit numbers, N and M, and two-bit positions, i and j. Write a method to insert M into N such that M starts at bit j and ends at bit i. You can assume that the bits j through i have enough space to fit all of M. Assuming index start from 0.
Examples:
a) N = 1024 (10000000000),
M = 19 (10011),
i = 2, j = 6
Output : 1100 (10001001100)
b) N = 1201 (10010110001)
M = 8 (1000)
i = 3, j = 6
Output: 1217 (10011000001)
This problem has been already discussed in the previous post. In this post, a different approach is discussed.
Approach: The idea is very straightforward, following is the stepwise procedure –
- Capture all the bits before i in N, that is from i-1 to 0.
- We don’t want to alter those bits so we will capture them and use later
- Clear all bits from j to 0
- Insert M into N at position j to i
- Insert captured bits at their respective position ie. from i-1 to 0
Let’s try to solve example b for a clear explanation of the procedure.
Capturing bits i-1 to 0 in N:
Create a mask whose i-1 to 0 bits are 1 and rest are 0. Shift 1 to i position in left and subtract 1 from this to get a bit mask having i-1 to 0 bits set.
capture_mask = ( 1 << i ) - 1
So for example b, mask will be –
capture_mask = ( 1 << 3 ) - 1
Now capture_mask = 1(001)
Now AND this mask with N, i-1 to 0 bits will remain same while rest bits become 0. Thus we are left with i-1 to 0 bits only.
captured_bits = N & capture_mask
for example b, captured bits will be –
captured_bits = N & capture_mask
Now capture_mask = 1 (001)
Clearing bits from j to 0 in N:
Since bits have been captured, clear the bits j to 0 without losing bits i-1 to 0. Create a mask whose j to 0 bits are 0 while the rest are 1. Create such mask by shifting -1 to j+1 position in left.
clear_mask = -1 << ( j + 1 )
Now to clear bits j to 0, AND mask with N.
N &= clear_mask
For example b will be:
N &= clear_mask
Now N = 1152 (10010000000)
Inserting M in N:
Now because N has bits from j to 0 cleared, just fit in M into N and shift M i position to left to align the MSB of M with position j in N.
M <<= i
For example b-
M <<= 3
Now M = 8 << 3 = 64 (1000000)
Do a OR of M with N to insert M at desired position.
N |= M
For example b –
N |= M
Now N = 1152 | 64 = 1216 (10011000000)
Inserting captured bits into N:
Till now M has been inserted into N. Now the only thing left is merging back the captured bits at position i-1 to 0. This can be simply done by OR of N and captured bits –
N |= captured_bits
For example b –
N |= captured_bits
N = 1216 | 1 = 1217 (10011000001)
So finally after insertion, the below bitset is obtained.
N(before) = 1201 (10010110001)
N(after) = 1201 (10011000001)
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void bin(unsigned n)
{
if (n > 1)
bin(n / 2);
printf ( "%d" , n % 2);
}
int insertion( int n, int m, int i, int j)
{
int clear_mask = -1 << (j + 1);
int capture_mask = (1 << i) - 1;
int captured_bits = n & capture_mask;
n &= clear_mask;
m = m << i;
n |= m;
n |= captured_bits;
return n;
}
int main()
{
int N = 1201, M = 8, i = 3, j = 6;
cout << "N = " << N << "(" ;
bin(N);
cout << ")"
<< "\n" ;
cout << "M = " << M << "(" ;
bin(M);
cout << ")"
<< "\n" ;
N = insertion(N, M, i, j);
cout << "After inserting M into N from 3 to 6"
<< "\n" ;
cout << "N = " << N << "(" ;
bin(N);
cout << ")"
<< "\n" ;
return 0;
}
|
Java
import java.io.*;
class GFG
{
static void bin( long n)
{
if (n > 1 )
bin(n / 2 );
System.out.print(n % 2 );
}
static int insertion( int n, int m,
int i, int j)
{
int clear_mask = - 1 << (j + 1 );
int capture_mask = ( 1 << i) - 1 ;
int captured_bits = n & capture_mask;
n &= clear_mask;
m = m << i;
n |= m;
n |= captured_bits;
return n;
}
public static void main (String[] args)
{
int N = 1201 , M = 8 , i = 3 , j = 6 ;
System.out.print( "N = " + N + "(" );
bin(N);
System.out.println( ")" );
System.out.print( "M = " + M + "(" );
bin(M);
System.out.println( ")" );
N = insertion(N, M, i, j);
System.out.println( "After inserting M " +
"into N from 3 to 6" );
System.out.print( "N = " + N + "(" );
bin(N);
System.out.println( ")" );
}
}
|
Python3
def insertion(n, m, i, j):
clear_mask = - 1 << (j + 1 )
capture_mask = ( 1 << i) - 1
captured_bits = n & capture_mask
n & = clear_mask
m = m << i
n | = m
n | = captured_bits
return n
def main():
N = 1201 ; M = 8 ; i = 3 ; j = 6
print ( "N = {}({})" . format (N, bin (N)))
print ( "M = {}({})" . format (M, bin (M)))
N = insertion(N, M, i, j)
print ( "***After inserting M into N***" )
print ( "N = {}({})" . format (N, bin (N)))
if __name__ = = '__main__' :
main()
|
C#
using System;
class GFG
{
static void bin( long n)
{
if (n > 1)
bin(n / 2);
Console.Write(n % 2);
}
static int insertion( int n, int m,
int i, int j)
{
int clear_mask = -1 << (j + 1);
int capture_mask = (1 << i) - 1;
int captured_bits = n & capture_mask;
n &= clear_mask;
m = m << i;
n |= m;
n |= captured_bits;
return n;
}
static public void Main (String []args)
{
int N = 1201, M = 8, i = 3, j = 6;
Console.Write( "N = " + N + "(" );
bin(N);
Console.WriteLine( ")" );
Console.Write( "M = " + M + "(" );
bin(M);
Console.WriteLine( ")" );
N = insertion(N, M, i, j);
Console.WriteLine( "After inserting M " +
"into N from 3 to 6" );
Console.Write( "N = " + N + "(" );
bin(N);
Console.WriteLine( ")" );
}
}
|
PHP
<?php
function bin( $n )
{
if ( $n > 1)
bin( $n / 2);
echo $n % 2;
}
function insertion( $n , $m , $i , $j )
{
$clear_mask = -1 << ( $j + 1);
$capture_mask = (1 << $i ) - 1;
$captured_bits = $n & $capture_mask ;
$n &= $clear_mask ;
$m = $m << $i ;
$n |= $m ;
$n |= $captured_bits ;
return $n ;
}
$N = 1201;
$M = 8;
$i = 3;
$j = 6;
echo "N = " . $N . "(" ;
bin( $N );
echo ")" . "\n" ;
echo "M = " . $M . "(" ;
bin( $M );
echo ")" . "\n" ;
$N = insertion( $N , $M , $i , $j );
echo "After inserting M into N " .
"from 3 to 6" . "\n" ;
echo "N = " . $N . "(" ;
bin( $N );
echo ")" . "\n" ;
?>
|
Javascript
<script>
function bin(n)
{
if (n > 1)
bin(Math.floor(n / 2));
document.write(n % 2);
}
function insertion(n,m,i,j)
{
let clear_mask = -1 << (j + 1);
let capture_mask = (1 << i) - 1;
let captured_bits = n & capture_mask;
n &= clear_mask;
m = m << i;
n |= m;
n |= captured_bits;
return n;
}
let N = 1201, M = 8, i = 3, j = 6;
document.write( "N = " + N + "(" );
bin(N);
document.write( ")<br>" );
document.write( "M = " + M + "(" );
bin(M);
document.write( ")<br>" );
N = insertion(N, M, i, j);
document.write( "After inserting M " +
"into N from 3 to 6<br>" );
document.write( "N = " + N + "(" );
bin(N);
document.write( ")<br>" );
</script>
|
Output:
N = 1201(10010110001)
M = 8(1000)
After inserting M into N from 3 to 6
N = 1217(10011000001)
Time complexity: O(log(M)+log(N))=O(log(M*N)
Auxiliary space: O(1)
Share your thoughts in the comments
Please Login to comment...