二进制数的插入

     位操作,掌握一些清零,置1和取每一位的技巧。

//题目描述
//
//有两个32位整数n和m,请编写算法将m的二进制数位插入到n的二进制的第j到第i位, 其中二进制的位数从低位数到高位且以0开始。
//给定两个数int n和int m,同时给定int j和int i,意义如题所述,请返回操作后的数,保证n的第j到第i位均为零,且m的二进制位数小于等于i - j + 1。
//测试样例:
//1024,19,2,6
//返回:1100

class BinInsert {
public:
    int binInsert(int n, int m, int j, int i) {
        // write code here
        ////保证n的j到i位均为0,且m的二进制位数小于等于i-j+1
        //return n | (m << j);

        ////取m的每一位,和n的对应位相与
        //int k = 0;
        //while (m!=0)
        //{
        //    int bit = m & 1;
        //    if (bit)
        //    {
        //        n |= 1 << (k + j);//为1,这一位也要为1,所以或
        //    }
        //    else
        //    {
        //        n &= ~(1 << (k + j));
        //    }
        //    k++;
        //    m >>= 1;
        //}

        //清零的方式  //定义掩码
        int mask = ~(((1 << (i - j + 1)) - 1) << j);  //111->111000->000111;对后面的没有影响
        n &= mask;  //i~j位置为0
        n |= (m << j);

        return n;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值