在此代码中输入 10000 时,我没有得到预期的输出。问题是关于将十进制转换为二进制

Posted

技术标签:

【中文标题】在此代码中输入 10000 时,我没有得到预期的输出。问题是关于将十进制转换为二进制【英文标题】:I am not getting the expected output while entering 10000 in this code. The problem is about converting decimal to binary 【发布时间】:2020-04-29 19:21:03 【问题描述】:

在此代码中输入 10000 时,我没有得到预期的输出。这是代码 *十进制转二进制*\

#include<iostream>
    using namespace std;

    int main() 
        int N,sum=0,pv=1,r;
        cin>>N;
        while(N>0)
            r=N%2;
            sum= sum + r*pv;
            N=N/2;
            pv=pv*10;
        
        cout<<sum<<endl;
    

【问题讨论】:

How to debug small programs 看起来您正在反转位。您首先获得 N 的最低位,但将它们放入总和的最高有效位。 你期望什么输出,你得到什么输出? 当输入像 10000 这样的大数字时,我得到的输出为 -468756976,但预期输出为 10011100010000 【参考方案1】:

您需要使用unsigned long long int 类型修饰符来获得预期的输出。 sum 的值不知何故超出了公共整数的限制。

只需修改您的声明:

unsigned long long int N, sum = 0, pv, r;

您的代码经过上述修改:

输出:

10000
10011100010000

你很高兴!

【讨论】:

感谢您的帮助,因为我是编程初学者【参考方案2】:

1000010 等于 100111000100002。 在大多数架构上,std::numeric_limits&lt;int&gt;::max() 是 2147483647(10),因此在计算 sumpv 时会出现整数溢出。

您可以为变量使用更广泛的类型,例如 unsigned long long,它至少应该是 64 位类型,但这不是解决方案。考虑到 214748364710 等于 11111111111111111111111111111112 和 11111111111111111111111111111110 比 18446745073709551110 大得多。 >

您似乎忘记了 Nint 一样,已经具有二进制表示。 std::cin &gt;&gt; N; 已经为您执行了十进制到二进制的转换。您所要做的就是提取这些位的值。

// Calculate the number of bits in a int
unsigned i = sizeof(N) * CHAR_BIT - 1;

// Skip the leading zeroes, if you want 
do

    if ( (N >> i) & 1u)
        break;
    --i;

while ( i );

// Print the bits, shifting and masking the number
do

    std::cout << ((N >> i) & 1u);

while ( i-- );
std::cout << '\n';

也可以尝试一些负数,您可能会注意到它们在内部使用two's complement 表示。

【讨论】:

以上是关于在此代码中输入 10000 时,我没有得到预期的输出。问题是关于将十进制转换为二进制的主要内容,如果未能解决你的问题,请参考以下文章

Keras LSTM 输入维度设置

以下代码中的错误是啥?没有得到预期的输出

model.fit 给出 ValueError :检查输入时出错:预期的 conv2d 得到了形状为 () 的数组

预期输入有 4 个维度,但得到的数组具有形状

ValueError:检查输入时出错:预期 lstm_1_input 具有 3 个维度,但得到的数组具有形状 (393613, 50)

过滤recyclerview在刷卡时没有得到正确的卡片位置