[CareerCup] 5.1 Insert Bits 插入位

简介:

5.1 You are given two 32-bit numbers, N and M, and two bit positions, land 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.
EXAMPLE
Input: N = 10000000000, M = 10011, i = 2, j = 6
Output: N = 10001001100

这道题给了我们两个二进制数N和M,又给了我们两个位置i和j,让我们在把N中的[i,j]替换为M。我最先想到的方法比较笨,就是先把N的后i位取出来存入结果中,然后再把M按对应位置存入结果中,最后把j之后的N的位存入结果中,参见代码如下:

解法一:

class Solution {
public:
    int insertBits(int n, int m, int i, int j) {
        int res = 0;
        for (int k = 0; k < i; ++k) {
            if (n & 1) res += 1 << k;
            n = n >> 1;
        }
        for (int k = i; k <= j; ++k) {
            if (m & 1) res += 1 << k;
            m = m >> 1;
            n = n >> 1;
        }
        res += n << (j + 1);
        return res;
    }
};

但是书上给出了一个更巧妙的解法,首先在N中把[i,j]对应的位清空,然后把M平移到对应的位置,然后用或来合并M和N即可,方法很巧妙,参见代码如下:

解法二:

class Solution {
public:
    int insertBits(int n, int m, int i, int j) {
        int allOnes = ~0;
        int left = allOnes << (j + 1);
        int right = (1 << i) - 1;
        int mask = left | right;
        int n_cleared = n & mask;
        int m_shifted = m << i;
        return n_cleared | m_shifted;
    }
};

本文转自博客园Grandyang的博客,原文链接:插入位[CareerCup] 5.1 Insert Bits ,如需转载请自行联系原博主。

相关文章
|
8月前
|
关系型数据库 MySQL 数据库
INSERT IGNORE与INSERT INTO的区别
INSERT IGNORE与INSERT INTO的区别
197 0
insert和insertselective的区别
insert和insertselective的区别
198 0
|
存储 算法 关系型数据库
explain中key_len的作用
还在等什么,快来一起讨论关注吧,公众号【八点半技术站】,欢迎加入社群
explain中key_len的作用
|
存储 索引
LeetCode 381. Insert Delete GetRandom O1 Dallowed
设计一个支持在平均 时间复杂度 O(1) 下, 执行以下操作的数据结构。
88 0
LeetCode 381. Insert Delete GetRandom O1 Dallowed
|
存储 索引
LeetCode 380. Insert Delete GetRandom O1
设计一个支持在平均 时间复杂度 O(1) 下,执行以下操作的数据结构。
51 0
LeetCode 380. Insert Delete GetRandom O1
|
SQL 关系型数据库 MySQL
Auto-increment 会在新记录插入表
Auto-increment 会在新记录插入表
110 0
【1089】Insert or Merge (25 分)
先模拟直接插入排序的每一趟的过程,并进行判断每一趟的序列和给出的第二个序列是否相同,若不相同则一定是归并排序,直接对第一个序列进行归并排序一趟并输出。 (1)归并排序可以使用非递归版本(更少);
102 0
|
关系型数据库 MySQL 索引
mysql insert判断记录存不存在 存在即更新不存在即插入 DUPLICATE key update
mysql insert判断记录存不存在 存在即更新不存在即插入 DUPLICATE key update
263 0