05.01. Insert Into Bits
Description
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.
Example1:
Input: N = 10000000000, M = 10011, i = 2, j = 6 Output: N = 10001001100
Example2:
Input: N = 0, M = 11111, i = 0, j = 4 Output: N = 11111
Solutions
Solution 1: Bit Manipulation
Thinking
\(M\) must occupy bits \(i\) through \(j\) of \(N\). A raw OR leaves leftover \(1\)s in that range that overwrite \(M\)’s zeros.
Clear \([i,j]\) first, then OR \(M\) shifted up by \(i\).
For each \(k\in[i,j]\) do \(N \&= \sim(1\ll k)\), then return \(N \mid (M \ll i)\). The interval is at most a word wide.
First, we clear the bits from the \(i\)-th to the \(j\)-th in \(N\), then we left shift \(M\) by \(i\) bits, and finally perform a bitwise OR operation on \(M\) and \(N\).
The time complexity is \(O(\log n)\), where \(n\) is the size of \(N\). The space complexity is \(O(1)\).
1 2 3 4 5 | |
1 2 3 4 5 6 7 8 | |
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 6 | |
1 2 3 4 5 6 | |
1 2 3 4 5 6 7 8 9 10 11 | |