【Leetcode 程序员面试金典 05.01】插入 —— 位运算

简介: 位运算问题,只需要把 N 的 i 到 j 位都置 0 后再和 M 左移 i 位的结果进行按位或即可

面试题 05.01 插入

给定两个整型数字NM,以及表示比特位置的iji <= 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)

题目分析

简单的位运算问题,只需要把 N 的 i 到 j 位都置 0 后再和 M 左移 i 位的结果进行按位或即可

在 Java 语言中,int 类型的左移位数n≥32时,JVM 会将n32取模,以确保左移的位数在 n 在 [0,31] 之间。因此,需使用0xffffffff << j << 1

public int insertBits(int N, int M, int i, int j) {
   
   
    int mask = (0xffffffff << j << 1) + ((1 << i) - 1);
    return N & mask | M << i;
}

位运算基础知识

  1. 判断奇偶:

    • 奇:(x & 1) == 1  ⟺  (x & 1) != 0

    • 偶:(x & 1) == 0  ⟺  (x & 1) != 1

  2. 乘(或除)以 2 的幂次:

    • x >> n  ⟺ x / 2^n

    • x << n  ⟺ x * 2^n

  3. 去除最后一位 1:x & (x - 1)

  4. 得到最后一位 1:x & -x

  5. 判断 2 的幂次:x & (x - 1) == 0

  6. 交换两个数:a ^= b; b ^= a; a ^= b;

  7. 交换符号:~x + 1  ⟺  -x

  8. 取绝对值:(x ^ x >> size(x) - 1) - (x >> size(x) - 1)  ⟺ x < 0 ? -x : x

  9. 构造 n 个 1:(1 << n) - 1

  10. 将最左边的 n 位清零:x & (~0 << n)

  11. 获取 x 的第 n 位值(0 或 1):(x >> n) & 1

  12. 获取 x 的第 n 位的幂值:x & (1 << n)

  13. 仅将第 n 位置为 1:x | (1 << n)

  14. 仅将第 n 位置为 0:x & (~(1 << n))

  15. 将 x 最高位至第 n 位(含)清零:x & ((1 << n) - 1)

  16. 将第 n 位至第 0 位(含)清零:x & (~((1 << (n + 1)) - 1))

  17. 取反第 n 位:x ^ (1 << n)

  18. 异或满足交换律、结合律:a ^ b ^ a = b ^ (a ^ a) = b ^ 0 = b

相关文章
|
26天前
|
算法 程序员 Go
PHP 程序员学会了 Go 语言就能唬住面试官吗?
【9月更文挑战第8天】学会Go语言可提升PHP程序员的面试印象,但不足以 solely “唬住” 面试官。学习新语言能展现学习能力、拓宽技术视野,并增加就业机会。然而,实际项目经验、深入理解语言特性和综合能力更为关键。全面展示这些方面才能真正提升面试成功率。
45 10
|
2月前
|
JavaScript 前端开发 小程序
CoderGuide 程序员前后端面试题库,打造全网最高质量题库
CoderGuide涵盖范围包括且不限于:前端面试题(Vue,React,JS,HTTP,HTML,CSS面试题等),后端面试题(Java,Python,Golang,PHP,Linux,Mysql面试题等),以及算法面试题,大厂面试题,高频面试题,校招面试题等,你想要的,这里都有!
42 2
|
2月前
|
开发者 索引 Python
这些年背过的面试题——LeetCode
本文是技术人面试系列LeetCode篇,一文带你详细了解,欢迎收藏!
|
4月前
|
前端开发 应用服务中间件 程序员
老程序员分享:Nginx相关面试题
老程序员分享:Nginx相关面试题
38 2
|
4月前
|
SQL JavaScript Java
java程序员面试题大全含答案(2018--2019)
java程序员面试题大全含答案(2018--2019)
|
3月前
|
Python
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
|
3月前
|
存储 算法 索引
1124. 表现良好的最长时间段 (python) 前缀和 分类讨论 最大长度 力扣 面试题
1124. 表现良好的最长时间段 (python) 前缀和 分类讨论 最大长度 力扣 面试题
|
3月前
|
存储 算法
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
|
4月前
|
算法 索引
力扣随机一题 位运算/滑动窗口/数组
力扣随机一题 位运算/滑动窗口/数组
32 0
|
2月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。