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

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;
}

逻辑说明

  1. 把输入的n存到temp变量中,通过右移操作统计它的二进制有效位数i(比如输入5,temp依次变为5→2→1→0,i最终为3)。
  2. 生成mask:1<<i是将1左移i位(i=3时为8,二进制1000),减1后得到i位全1的数(7,二进制111)。
  3. 对n按位取反~n,但由于int是有符号类型,取反后会有大量高位1,用mask与取反结果相与,就能只保留低i位的取反结果,也就是我们需要的补码(比如~5是...11111010,和111相与得到010,即十进制2)。

内容的提问来源于stack exchange,提问作者DeeZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 02:11:00