Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、问题描述
给定两个整型数字 N
与 M
,以及表示比特位置的 i
与 j
(i <= j
,且从 0 位开始计算)。
编写一种方法,使 M
对应的二进制数字插入 N
对应的二进制数字的第 i ~ j
位区域,不足之处用 0
补齐。具体插入过程如图所示。
题目保证从 i
位到 j
位足以容纳 M
, 例如: M = 10011
,则 i~j
区域至少可容纳 5 位。
题目链接:插入。
二、题目要求
样例
输入:N = 1024(10000000000), M = 19(10011), i = 2, j = 6
输出:N = 1100(10001001100)
考察
1.位运算中等题型、面试题
2.建议用时15~30min
三、问题分析
本题是位运算的第14题,没了解过位运算相关知识点可以看这一篇文章,讲解比较详细:
刚拿到这题,我想一个个位数判断,开始做的时候发现太麻烦了,而且位运算的优势没发挥出来。打开这题的评论区,有的人(包括我)已经开始摆烂了。
看题解的时候发现了一个大佬巧妙的做法,分为三步解决:
1.将N二进制i~j位置上面置为0,异或计算就可以置为0。因为1<<k肯定是N的子集,相同,异或为0
2.将M向左移动i个位置
3.N+M,返回结果
四、编码实现
class Solution {
public:
int insertBits(int N, int M, int i, int j) {
int k;
for(k=i;k<=j;k++)//将N二进制i~j位置上面置为0
{
if(N&(1<<k))
{
N=N^(1<<k);//异或计算
}
}
M=M<<i;//将M向左移动i个位置
return N+M;//N+M,返回结果
}
};