给出两个32位的整数N和M,以及两个二进制位的位置i和j。写一个方法来使得N中的第i到j位等于M(M会是N中从第i为开始到第j位的子串)
样例
给出N = (10000000000)2,M = (10101)2, i = 2, j = 6
返回 N = (10001010100)2
挑战
最少的操作次数是多少?
分析:这道题粗粗一看蛮简单,但实际上坑很多,而且间接性的考了原码反码和补码(负数的二进制表示),我的做法是先都转换成二进制表示,然后再把二进制表示转成结果。
代码:
vector<int> toBinary(int n)
{
bool positive = (n>=0);
long long temp = positive?(long long)n:(long long)n*(long long)(-1);
vector<int> A;
while(temp>0)
{
A.push_back(temp&1);
temp>>=1;
}
while(A.size()<32)
A.push_back(0);
if(A.size()>32)//负数极限
A.pop_back();
reverse(A.begin(),A.end());
if(!positive)
{
for(int i=0;i<32;i++)
A[i] = 1-A[i];
int k = 31;
while(k>=0&&A[k]!=0)
k--;
A[k++]=1;
while(k<32)
A[k++]=0;
}
return A;
}
int binaryToInt(vector<int> A)
{
if(A[0]==1)
{
for(int i=1;i<32;i++)
A[i] = 1-A[i];
int k = 31;
while(k>=0&&A[k]==1)
k--;
A[k++] = 1;
while(k<32)
A[k++] = 0;
}
long long ret = 0;
for(int i=1;i<32;i++)
ret = ret*2+A[i];
return A[0]==0?ret:ret*-1;
}
class Solution {
public:
/**
*@param n, m: Two integer
*@param i, j: Two bit positions
*return: An integer
*/
int updateBits(int n, int m, int i, int j) {
// write your code here
vector<int> A = toBinary(n);
vector<int> B = toBinary(m);
int len = j-i+1;
int t = A.size()-1-i;
int p = B.size()-1;
while(len--)
{
A[t--] = B[p--];
}
int ret = binaryToInt(A);
return ret;
}
};