lintcode:Update Bits

Given two 32-bit numbers, N and M, and two bit positions, i and j.
Write a method to set all bits between i and j in N equal to M (e g ,
M becomes a substring of N located at i and starting at j)

Example Given N=(10000000000)2, M=(10101)2, i=2, j=6

return N=(10001010100)2

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

Challenge Minimum number of operations?

Clarification 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.

这题如果转化为二进制字符串再操作不难。
但如何用位操作来达到目标比较难。

  • 如果j<31,即j不在最高位上。可以把i到j位清为0,可以((1<<(j+1))-(1<<i))得到i到j之间全是1的数,再取反,得到i到j之间全是0的数。
  • 如果j=32,(1<<(j+1))即(1<<32),相当于1<<1 不可行。可以直接(1<<i)-1 得到i到j之间全是0,其他地方是1的数。
  • 上面得到的数成为掩码
  • (m<<i)+(n&mask) 可以得到最终解。
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
        int mask;
        if(j<31){
            mask=~((1<<(j+1))-(1<<i));
        }else{
            mask=(1<<i)-1;
        }

        return (m<<i)+(n&mask);

    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值