面试题 05.01. 插入

本文介绍了如何在二进制数N的指定位置i到j插入另一个二进制数M,通过位操作实现。提供了两种解题方法,一种是逐位比较并更新,另一种是先清零目标区域再进行左移和按位或操作。代码示例展示了Go语言的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出


题目描述

给定两个整型数字 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]的每一位,然后比较NM当前位上的数字,二者如果相等,则跳过,如果N该位上的数字为1,而M该位上的数字为0,那么可以通过N & ^(1 << k),来将Nk位置为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
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值