将十进制转换为32位二进制?

时间:2012-05-21 09:26:06

标签: c++ algorithm binary decimal

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

我希望以传统的“数学”方式(而不是使用 bitset 或使用 vector * .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位二进制将有对于C ++中的任何数字类型,它是否都是32位数?这里有什么建议,关于显示32位数字是否需要问题?

7 个答案:

答案 0 :(得分: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为否定,则这两种变体都不起作用。

答案 1 :(得分:4)

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

答案 2 :(得分:3)

使用for-loop和预定义的零字符数组:

#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都被视为true。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

正如其他人所指出的,你需要在a中生成结果 串。这样做的经典方法(适用于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;
}

然后您可以显示它。

答案 5 :(得分:0)

递归。在伪代码中:

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

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

答案 6 :(得分:0)

只需写下:

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

而不是:

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

那应该可以解决问题。