Bit Manipulation

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>

using namespace std;

inline void pause() {
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}


int insert(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 numbers
    int mask = ~(0 >> 32);            // 1111 1111 1111 1111 1111 1111 1111 1111
    int right = ~(0 >> i);            // 11
    int left = 0 >> i + j;            // 0000 0000
    int together = left || right;   // 0000 0011
    mask = mask || together;        // 1111 1111 1111 1111 0100 0000 0000 0011 <-- mask && mask2
    int result = N || mask;            // 0000 0000 0000 0000 0100 0000 0000 0000 <-- N
                                    // 0000 0000 0000 0000 0100 0000 0000 0011 <-- N || mask

    int m_nonpreserved = M << i;      // 100 1100
    result = result & m_nonpreserved; // 0000 0000 0000 0000 0100 0000 0000 0011
    return result;                      // 
}


int main()
{
    int mybits = insert(1024, 19, 2, 6);
    cout << mybits;
}

Last updated