给定两个32位的数,N和M,还有两个指示位的数,i和j。 写程序使得N中第i位到第j位的值与M的值相同(即:M变成N的子串且位于N的第i位和第j位之间)
例子:
输入: N = 10000000000, M = 10101, i = 2, j = 6
输出: N = 10001010100
思路:使用一个mask,该mask的j+1位到最高位都为1,i位到j位都为0,0位到i-1位都为1。将N和mask进行与运算,得到的结果是将N的i位到j位清零。然后将该结果和M左移i位的结果进行或运算,得到最终结果。
#include <iostream> #include <vector> using namespace std; int UpdateBits(int n, int m, int i, int j) { int max = ~0; int left = max - (1 << (j+1) - 1); int right = (1 << i) - 1; int mask = left | right; return (n & mask) | (m << i); } void Print(int n) { vector<int> v; while (n != 0) { if (n & 1) v.push_back(1); else v.push_back(0); n >>= 1; } for (int i = v.size() - 1; i >=0; --i) cout << v[i]; cout << endl; } int main() { int n, m, i, j; while (cin >> n) { cin >> m >> i >> j; Print(n); Print(m); Print(UpdateBits(n, m, i, j)); } return 0; }