本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出
题目描述
给定两个整型数字 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)
题目链接
题目分析
这道题有两种解法,我的解法是可以遍历[i, j]
的每一位,然后比较N
和M
当前位上的数字,二者如果相等,则跳过,如果N
该位上的数字为1,而M
该位上的数字为0,那么可以通过N & ^(1 << k)
,来将N
第k
位置为0,相反,如果N
该位上数字为0,而M
该位上数字为1,则可以通过N | (1 << k)
将N
第k位上的数字置1,这样就完成了题目的要求
特别注意:go中左移右移的优先级要低于+和-,所以需要加括号,防止出错
另外一种解法的话可以先将N
的第i
位到第j
位都先置0,之后让M
左移i
位再与N
做或运算,就可以得到最后的结果
解题代码
Solution One
Go
func insertBits(N int, M int, i int, j int) int {
for k:=0; k<=j-i; k++ {
a, b := (N >> (k+i)) & 1, (M >> k) & 1
if a == 1 && b == 0 {
N = N & ^(1 << (k + i))
}
if a == 0 && b == 1 {
N = N | 1 << (k + i)
}
}
return N
}
Solution Two
Go
func insertBits(N int, M int, i int, j int) int {
for k:=i; k<=j; k++ {
N &= ^(1 << k)
}
N |= M << i
return N
}