Q:
You are given two 32-bit numbers, N and M, and two bit positions, i and j. Write a method to set all bits between i and j in N equal to M (e.g., M becomes a substring of N located at i and starting at j).
EXAMPLE:
Input: N = 10000000000, M = 10101, i = 2, j = 6
Output: N = 10001010100
A:
先将N的第0为到i位保存到ret,不包括第i位, 接下来将N的第0位到第j位置0, 包括第j位。 最后或上(m<<i) | ret。
#include <iostream>
#include <vector>
using namespace std;
void print_binary(int n) {
vector<int> bit;
int m = 1;
int len = 8*sizeof(int);
while(len--) {
if (n&m) bit.push_back(1);
else bit.push_back(0);
m <<= 1;
}
while (!bit.empty()) {
cout<<bit.back();
bit.pop_back();
}
cout<<endl;
}
int update_bits(int n, int m, int i, int j) {
int ret = (1<<i)-1;
ret &= n;
return (n>>(j+1))<<(j+1) | (m<<i | ret);
}
int main(){
int n = 1<<10, m = 21;
int ans = update_bits(n, m, 2, 6);
print_binary(n);
print_binary(m);
print_binary(ans);
return 0;
}