3

将 C++ 中的正整数(0 到 2,147,483,647)转换为 32 位二进制并显示。

我想以传统的“数学”方式(而不是使用bitset或使用向量* .pushback * 或递归函数或 C++ 中的一些特殊东西......),(一个原因是你可以用不同的语言实现它,也许)

所以我继续实现一个像这样的简单程序:

#include <iostream>
using namespace std;
int main()
{
    int dec,rem,i=1,sum=0;
    cout << "Enter the decimal to be converted: ";
    cin>>dec;
    do
    {
        rem=dec%2;
        sum=sum + (i*rem);
        dec=dec/2;
        i=i*10;
    } while(dec>0);

    cout <<"The binary of the given number is: " << sum << endl;

    system("pause");
    return 0;
}

问题是当您输入一个大数字(例如 9999)时,结果将是一个负数或一些奇怪的数字,因为 sum 是整数并且它不能处理超过它的最大范围,所以您知道 32 位二进制将有 32 位所以对于 C++ 中的任何数字类型来说它都太大了吗?这里有什么建议以及关于显示 32 位数字的问题吗?

4

7 回答 7

7

结果你得到sum的东西除了打印之外几乎不能用于任何东西。这是一个十进制数,看起来就像一个二进制数。

如果十进制-二进制转换本身没有结束,请注意计算机内存中的数字已经以二进制表示(这不是 C++ 的属性),您唯一需要的就是打印它的方法。一种可能的方法如下:

int size = 0;
for (int tmp = dec; tmp; tmp >>= 1)
    size++;
for (int i = size - 1; i >= 0; --i)
    cout << ((dec >> i) & 1);

使用字符数组的另一个变体:

char repr[33] = { 0 };
int size = 0;
for (int tmp = dec; tmp; tmp >>= 1)
    size++;
for (int i = 0; i < size; ++i)
    repr[i] = ((dec >> (size - i - 1)) & 1) ? '1' : '0';
cout << repr << endl;

dec请注意,如果为负数,这两种变体都不起作用。

于 2012-05-21T09:55:26.740 回答
4

你有一个数字并且想要它的二进制表示,即一个字符串。因此,使用字符串而不是数字类型来存储您的结果。

于 2012-05-21T09:34:51.917 回答
3

您可以使用无符号整数类型。但是,即使使用更大的类型,您最终也会用完存储二进制表示的空间。您最好将它们存储在string.

于 2012-05-21T09:32:22.023 回答
3

使用 for 循环和预定义的零字符数组:

#include <iostream>
using namespace std;
int main()
{
    int dec;
    cout << "Enter the decimal to be converted: ";
    cin >> dec;

    char bin32[]  = "00000000000000000000000000000000";
    for (int pos = 31; pos >= 0; --pos)
    {
        if (dec % 2) 
            bin32[pos] = '1';
        dec /= 2;
    }

    cout << "The binary of the given number is: " << bin32 << endl;
}

出于性能原因,您可能会过早地暂停 for 循环:

    for (int pos = 31; pos >= 0 && dec; --pos)

请注意,在 C++ 中,您可以将整数视为布尔值 - 一切 != 0 都被认为是真的。

于 2012-05-21T11:17:52.073 回答
1

正如其他人指出的那样,您需要在字符串中生成结果。执行此操作的经典方法(适用于 2 到 36 之间的任何基数)是:

std::string
toString( unsigned n, int precision, unsigned base )
{
    assert( base >= 2 && base <= 36 );
    static char const digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    std::string retval;
    while ( n != 0 ) {
        retval += digits[ n % base ];
        n /= base;
    }
    while ( retval.size() < precision ) {
        retval += ' ';
    }
    std::reverse( retval.begin(), retval.end() );
    return retval;
}

然后,您可以显示它。

于 2012-05-21T10:34:16.423 回答
0

递归。在伪代码中:

function toBinary(integer num)
  if (num < 2) 
  then
    print(num)
  else
    toBinary(num DIV 2)
    print(num MOD 2)
  endif
endfunction

这不处理前导零或负数。递归堆栈用于将二进制位反转为标准顺序。

于 2012-05-21T12:43:41.867 回答
-1

写吧:

long int dec,rem,i=1,sum=0  

代替:

int dec,rem,i=1,sum=0;

那应该可以解决问题。

于 2013-08-11T15:20:26.670 回答