将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位数字是否需要问题?
答案 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;
那应该可以解决问题。