5.1 Insertion: You are 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. That is, if M = 10011, you can assume that there are at least 5 bits between j and i. You would not, for example, have j = 3 and i = 2, because M could not fully fit between bit 3 and bit 2.
EXAMPLE
Input: N 10000000000, M = 10011 i 2, j 6
Output: 10001001100
Brain storm:
Manipulate vulnerable and preserved values
109 8 7 6 5 4 3 2 1 0
1 0 0 0 0 0 0 0 0 0 0 <-- N
1 1 1 1 0 0 0 0 0 1 1 mask <-- preserve outside using i and j
1 0 0 0 0 0 0 0 0 0 0 preserved <-- N & mask
1 0 0 1 1 0 0 <-- M + i nonpreserved states (i)
1 0 0 0 1 0 0 1 1 0 0 <-- (N & mask) & M + i = result
#include<iostream>#include<string>usingnamespace std;inlinevoidpause() {cin.ignore(numeric_limits<streamsize>::max(),'\n');}intinsert(int N,int M,int i,int j) { // N = 1010 1101 1111 0010 1110 0011 1011 1111 // M = 1001 1 // i = 2 // j = 6 // assuming 32 bit numbersint mask =~(0>>32); // 1111 1111 1111 1111 1111 1111 1111 1111int right =~(0>> i); // 11int left =0>> i + j; // 0000 0000int together = left || right; // 0000 0011 mask = mask || together; // 1111 1111 1111 1111 0100 0000 0000 0011 <-- mask && mask2int result = N || mask; // 0000 0000 0000 0000 0100 0000 0000 0000 <-- N // 0000 0000 0000 0000 0100 0000 0000 0011 <-- N || maskint m_nonpreserved = M << i; // 100 1100 result = result & m_nonpreserved; // 0000 0000 0000 0000 0100 0000 0000 0011return result; // }intmain(){int mybits =insert(1024,19,2,6); cout << mybits;}