LC-1009:十进制整数的补码实现代码异常求助
问题分析与修正
你的代码里有几个关键错误导致结果不符合预期,逐个说明:
- 循环中n未更新:
n>>1;仅执行右移运算,但未将结果赋值回n,导致n始终是初始输入值,循环无法终止,后续mask计算完全错误。必须改成n >>= 1;或者n = n >> 1;。 - 冗余的二进制转十进制操作:用
pow(10,i)拼接二进制位为十进制数完全没必要,我们只需要统计输入数字的二进制有效位数i,这部分代码直接删掉即可。 - mask计算可简化:原代码用j循环生成mask的方式太繁琐,知道有效位数i后,直接用
(1 << i) - 1就能得到i位全1的mask,比如i=3时,1<<3是8,减1后就是7(二进制111)。
修正后的代码
// 计算十进制整数的二进制有效位补码 #include <iostream> using namespace std; int main() { int n; cout << "enter a number:"; cin >> n; // 统计二进制有效位数 int temp = n; int i = 0; while (temp != 0) { temp >>= 1; i++; } // 生成对应位数的全1掩码 int mask = (1 << i) - 1; // 取反后和掩码相与,得到有效位的补码 int answer = (~n) & mask; cout << answer << endl; return 0; }
逻辑说明
- 把输入的n存到temp变量中,通过右移操作统计它的二进制有效位数i(比如输入5,temp依次变为5→2→1→0,i最终为3)。
- 生成mask:
1<<i是将1左移i位(i=3时为8,二进制1000),减1后得到i位全1的数(7,二进制111)。 - 对n按位取反
~n,但由于int是有符号类型,取反后会有大量高位1,用mask与取反结果相与,就能只保留低i位的取反结果,也就是我们需要的补码(比如~5是...11111010,和111相与得到010,即十进制2)。
内容的提问来源于stack exchange,提问作者DeeZ
相关产品推荐
相关产品推荐

