C语言invert(x,p,n)函数实现要求及提交的解决方案正确性验证
C语言invert函数实现正确性分析
你给出的解决方案是错误的,不符合需求要求。
错误原因分析
- 核心逻辑缺陷:你的实现中先将
x右移(p+1-n)位,再与低n位全1的数值异或,这个操作直接丢失了x中除了被移动到低n位之外的所有比特信息,完全没有保留其余比特位的原有数值,违反了需求中「其余比特位保持不变」的要求。 - 测试用例验证:你使用的测试用例
invert(6,4,3),6的二进制为00000110(8位表示,比特编号约定从最低位开始从0计数),按需求要取反第4位开始的3个比特(即第4、3、2位):原x对应三个比特的值为
0(第4位)、0(第3位)、1(第2位),取反后应为1、1、0,其余位保持不变,最终结果应为00011010(即十进制26),而你的代码输出6,明显不符合预期。
正确实现方案
要实现指定位置比特取反、其余位不变的核心逻辑是构造仅目标位为1、其余位为0的掩码,再将x与掩码异或(异或1对应位取反,异或0对应位不变):
- 先构造低n位全1的掩码:
~(~0U << n),使用0U避免有符号整数左移溢出问题 - 将低n位全1的掩码左移到目标位置:
<< (p + 1 - n) - x与掩码异或得到最终结果
正确代码示例
#include <stdio.h> unsigned invert(unsigned x, int p, int n) { unsigned mask = ~(~0U << n) << (p + 1 - n); return x ^ mask; } int main() { printf("%d\n", invert(6, 4, 3)); // 输出26,符合需求预期 return 0; }
内容的提问来源于stack exchange,提问作者gautam bhuyan
相关产品推荐
相关产品推荐

