You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言实现insertBits函数:将Y的二进制位插入X最后置位后的技术求助

问题分析

你现在的核心需求是把Y的二进制位插入到X的最右边置位(最低位的1)之后,其实完全不需要把十进制转成二进制字符串来操作——直接用位运算就能高效完成,逻辑也更清晰。

先结合你的例子拆解核心逻辑:

  • 比如X=10(二进制1010),最右边的1在第1位(0-based,对应数值2),它右边有1个0;Y=14是4位二进制1110。
  • 我们需要把X拆成101(去掉右边的0)和0(右边的0)两部分,再把101 + 1110 + 0拼接起来,得到10111100(即188)。

用位运算实现这个拼接,只需要三步:

  1. 找到X最右边的1后面有多少个0(记为shift_right),这决定了最终结果需要补回多少个后缀0。
  2. 计算Y的二进制位数(记为y_bits),这决定了X的高位部分需要左移多少位来给Y腾空间。
  3. 把X的高位部分(去掉后缀0)左移y_bits位,和Y合并,再整体左移shift_right位补回后缀0,得到最终结果。
完整代码实现
#include <stdio.h>

int insertBits(int X, int Y) {
    // 如果Y是0,插入后X不变,直接返回
    if (Y == 0) {
        return X;
    }

    // 计算X最右边的1后面的0的个数(后缀0数量)
    int shift_right = 0;
    while ((X & (1 << shift_right)) == 0) {
        shift_right++;
    }

    // 计算Y的二进制位数
    int y_bits = 0;
    int temp_y = Y;
    while (temp_y != 0) {
        y_bits++;
        temp_y >>= 1;
    }

    // 提取X的高位部分(去掉后缀0)
    int high_part = X >> shift_right;
    // 高位左移腾空间、合并Y、补回后缀0,得到最终结果
    return (high_part << y_bits | Y) << shift_right;
}

int main() {
    int X, Y;
    scanf("%d %d", &X, &Y);
    printf("%d", insertBits(X, Y));
    return 0;
}
代码细节解释
  1. 特殊情况处理:如果Y是0,插入操作不会改变X,直接返回X即可。
  2. 计算shift_right:通过循环逐位检查,找到X最右边的1的位置,这个位置值就是后缀0的数量。
  3. 计算y_bits:通过不断右移Y直到为0,统计出Y的二进制位数。
  4. 拼接结果:
    • X >> shift_right:去掉X的后缀0,得到高位核心部分。
    • high_part << y_bits:把高位部分左移,为Y腾出足够的位置。
    • | Y:将Y合并到腾出的位置中。
    • << shift_right:把整体左移,补回原来的后缀0,得到最终的目标数值。
测试验证
  • 输入10 14,输出188,和你的示例完全一致。
  • 输入152 9,输出2504,也符合示例要求。

另外你之前写的bin函数其实不需要——位运算直接操作二进制位,比转成字符串再处理高效得多,也更符合C语言的编程习惯。

内容的提问来源于stack exchange,提问作者Akash G S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 13:37:36