C语言编写无符号整数位反转程序输出结果错误问题求解
问题原因与修复方案
错误点
- 核心错误在
reverse_bits函数的循环逻辑:while (n > 0)的终止条件只会处理n二进制末尾到最高位1的部分,完全忽略了高位的0,不会将这些0对应的位置计入反转结果。
你输入12时,二进制有效位仅为末尾4位1100,你的代码仅反转这4位得到0011也就是十进制3,和你得到的错误输出完全一致。示例要求反转全部16位(含高位12个0),你没有处理这些高位0,缺少了12次左移占位的步骤,结果自然不符合预期。 - 额外注意:unsigned int的位长是平台相关的,常见为16位、32位、64位,要实现全位反转必须遍历所有位,而非仅遍历到n变为0。
修复后代码
#include <stdio.h> //function prototype unsigned int reverse_bits(unsigned int n); int main(void) { unsigned int n; unsigned int bits; printf("Enter an unsigned integer: "); scanf("%u",&n); bits = reverse_bits(n); printf("%u\n",bits); return 0; } unsigned int reverse_bits(unsigned int n) { unsigned int reverse = 0; // 按当前平台unsigned int的总位数遍历,兼容16/32/64位场景 int bit_count = sizeof(unsigned int) * 8; for (int i = 0; i < bit_count; i++) { reverse = reverse << 1; if((n & 1) == 1) { reverse = reverse | 1; } n = n >> 1; } return reverse; }
效果验证
如果你的场景固定为16位unsigned int,把bit_count改为16即可。输入12测试时,循环执行16次,前12次处理高位的0,每次reverse左移1位补0,后4次处理1100,最终得到二进制0011000000000000,对应十进制12288,符合预期。
内容的提问来源于stack exchange,提问作者ulysessg
相关产品推荐
相关产品推荐

