原文链接: https://leetcode-cn.com/problems/insert-into-bits-lcci
英文原文
You are given two 32-bit numbers, N and M, and two bit positions, i and j. Write a method to insert M into N such that M starts at bit j and ends at bit i. 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.
Example1:
Input: N = 10000000000, M = 10011, i = 2, j = 6 Output: N = 10001001100
Example2:
Input: N = 0, M = 11111, i = 0, j = 4 Output: N = 11111
中文题目
给定两个整型数字 N
与 M
,以及表示比特位置的 i
与 j
(i <= j
,且从 0 位开始计算)。
编写一种方法,使 M
对应的二进制数字插入 N
对应的二进制数字的第 i ~ j
位区域,不足之处用 0
补齐。具体插入过程如图所示。
题目保证从 i
位到 j
位足以容纳 M
, 例如: M = 10011
,则 i~j
区域至少可容纳 5 位。
示例1:
输入:N = 1024(10000000000), M = 19(10011), i = 2, j = 6 输出:N = 1100(10001001100)
示例2:
输入: N = 0, M = 31(11111), i = 0, j = 4 输出:N = 31(11111)
通过代码
高赞题解
插入
CC189 面试题 04.06
难度:
简单
tags:
位运算
题目描述
插入。给定两个32位的整数N
与M
,以及表示比特位置的i
与j
。编写一种方法,将M
插入N
,使得M从N的第j位开始,到第i
位结束。假定从j
位到i
位足以容纳M
,也即若M = 10 011,那么j和i之间至少可容纳5个位。例如,不可能出现j = 3和i = 2的情况,因为第3位和第2位之间放不下M。
示例1:
输入:N = 10000000000, M = 10011, i = 2, j = 6
输出:N = 10001001100
示例2:
输入: N = 0, M = 11111, i = 0, j = 4
输出:N = 11111
思路
按题目的意思,并不是把 M 移位后和 N 相加,而只是单纯地覆盖。所以可以分两步进行:
- 把 N 中 i - j 的位置置零先
- 把 M 左移 i 位后和 N 相加
class Solution {
public:
int insertBits(int N, int M, int i, int j) {
for (int k = i; k <= j; k++) {
if (N & (1 << k)) {
N -= (1 << k);
}
}
N += (M << i);
return N;
}
};
统计信息
通过次数 | 提交次数 | AC比率 |
---|---|---|
10081 | 19989 | 50.4% |
提交历史
提交时间 | 提交结果 | 执行时间 | 内存消耗 | 语言 |
---|