当前位置: 首页 > article >正文

力扣面试题 - 24 插入

题目:

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

思路:

  1. 清零目标区域:首先,将 N 的第 ij 位清零。

    1. 构造一个掩码,掩码的第 ij 位为0,其他位为1。

    2. 使用按位与操作(&)将目标区域清零。

  2. 将 M 左移到正确位置:M 左移 i 位,使其对齐到 N 的第 i 位。

  3. 将 N 和 M 合并:将处理后的 N 和处理后的 M 使用按位或操作(|),得到最终结果。

C代码如下:

int insertBits(int N, int M, int i, int j) {
    // 生成全1的掩码
    unsigned int allOnes = ~0U; 
    
    // 左侧掩码,掩码会清空第 i 到 j 位,左侧为1,右侧为0
    unsigned int leftMask = (j < 31) ? (allOnes << (j + 1)) : 0;
    // 右侧掩码,清空第 i 位到低位
    unsigned int rightMask = (1U << i) - 1;
    
    // 组合掩码,第 i 到 j 位为 0,其它为 1
    unsigned int clearMask = leftMask | rightMask; 
    
    // 清除 N 中的第 i 到 j 位
    N &= clearMask;
    
    // 将 M 左移到正确的位置
    M <<= i;
    
    // 将 M 插入 N 的相应位置
    return N | M;
}


http://www.kler.cn/a/405746.html

相关文章:

  • 优化注意力层提升 Transformer 模型效率:通过改进注意力机制降低机器学习成本
  • Go语言进阶依赖管理
  • 043 商品详情
  • QT实操中遇到的一些(C++)疑惑点汇总
  • 大语言模型中ReLU函数的计算过程及其函数介绍
  • RPC-健康检测机制
  • Node.js笔记(四)局域网聊天室2:服务端接受客户端消息
  • PostGIS分区表创建
  • 探索 Python 字典的奥秘:Future 对象为何能成为字典的键?
  • 【UE5】Slider控件样式
  • 【ubuntu24.04】安装mongodb社区版本
  • 14.C++STL1(STL简介)
  • 标题gitLab如何打标签
  • DASCTF 2024 10月 Reverse 完成笔记 附题目
  • 红帽RHCSA认证怎么报名?红帽初级认证报考指南!
  • 【单点知识】基于PyTorch讲解自动编码器(Autoencoder)
  • 【数据分享】中国价格统计年鉴(2013-2024) PDF
  • 区块链安全常见的攻击——自毁漏洞(Self-Destruct Vulnerability)【2】
  • C++
  • Vue3 使用v-for 渲染列表数据后更新
  • SQLSever显示物理和逻辑 IO活动量的相关信息及显示分析、编译和执行各语句所需的毫秒数。
  • vue2 src_消息订阅和发布(pubsub-js)
  • 冲破AI 浪潮冲击下的 迷茫与焦虑
  • C语言字符串搜索函数
  • MATLAB读入不同类型图像并显示图像和相关信息
  • springboot基于微信小程序的农产品交易平台