LintCode-更新二进制位

来源:互联网 发布:应用商店排名优化 编辑:程序博客网 时间:2024/05/16 10:34

给出两个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;    }};


0 0
原创粉丝点击