• 179. 更新二进制位


    179. 更新二进制位 

     

    给出两个32位的整数N和M,以及两个二进制位的位置i和j。写一个方法来使得N中的第i到j位等于M(M会是N中从第i为开始到第j位的子串)

     注意事项

    In the function, the numbers N and M will given in decimal, you should also return a decimal number.

    说明

    You can assume that the bits j through i have enough space to fit all of M. That is, if M=10011, you can assume that there are at least 5 bits between j and i. You would not, for example, have j=3 and i=2, because M could not fully fit between bit 3 and bit 2.

    样例

    给出N = (10000000000)2,M = (10101)2, i = 2, j = 6

    返回 N = (10001010100)2

    int UpdateBits::updateBits(int n, int m, int i, int j) {
        // write your code here
        /*
         *  解题思路:如果j<31,即j不在最高位上。可以把i到j位清为0,可以((1<<(j+1))-(1<<i))得到i到j之间全是1的数,再取反,得到i到j之间全是0的数。
         *  如果j=31,(1<<(j+1))即(1<<32),相当于1<<1 不可行。可以直接(1<<i)-1 得到i到j之间全是0,其他地方是1的数。
         *  上面得到的数成为掩码
         *  (m<<i)+(n&mask) 可以得到最终解。
         * */
        Print2(n);
        Print2(m);
        int mask = 0;
        if (j < 31) {
            mask = ~((1 << (j + 1)) - (1 << i));
            cout << "j+1->>>" << endl;
            Print2(1 << (j + 1));
            cout << "(1 << i)" << endl;
            Print2(1 << i);
    
            Print2((1 << (j + 1)) - (1 << i));
    
        } else {
            mask = (1 << i) - 1;
        }
    
    
        Print2(mask);
        n = (m << i) + (n & mask);
        Print2(n);
        return n;
    }
    
    void UpdateBits::Print2(int num) {
        cout << bitset<sizeof(int) * 8>(num) << endl;
    }
    

      

  • 相关阅读:
    Redis 的 5 个常见使用场景
    当别人给你一个wsdl或者webservice接口时
    Java事务
    Java分布式锁的三种实现方案(redis)
    使用Redis数据库(String类型)
    超详细Redis数据库入门教程
    java对redis的基本操作(初识)
    String、StringBuffer与StringBuilder之间区别
    java正则表达式替换空格和换行符
    Linux 批量管理工具
  • 原文地址:https://www.cnblogs.com/kanekiken/p/7989434.html
Copyright © 2020-2023  润新知