给出两个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; } };
时间: 2024-11-03 05:38:33