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)。
用位运算实现这个拼接,只需要三步:
- 找到X最右边的1后面有多少个0(记为
shift_right),这决定了最终结果需要补回多少个后缀0。 - 计算Y的二进制位数(记为
y_bits),这决定了X的高位部分需要左移多少位来给Y腾空间。 - 把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; }
代码细节解释
- 特殊情况处理:如果Y是0,插入操作不会改变X,直接返回X即可。
- 计算
shift_right:通过循环逐位检查,找到X最右边的1的位置,这个位置值就是后缀0的数量。 - 计算
y_bits:通过不断右移Y直到为0,统计出Y的二进制位数。 - 拼接结果:
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
相关产品推荐
相关产品推荐

