十进制转二进制整数部分和小数部分的转换方法有所不同,因此我将输入的浮点数分成了整数 部分和小数部分,floor函数可实现此功能。整数部分需要不断除2取余直至商为0,最后从下到上写出余数。
int y1;
y1=floor(n); //y1为n的整数部分
y2=n-y1; //y2为n的小数部分
while(y1>0)
{
x1[i]=y1%2;
y1=y1/2;
i++;
}
for(int m=i-1;m>=0;m--) //m=i-1是因为最后一次i++导致数组比实际所用多出一位
{
cout<<x1[m];
}
小数部分需要不段乘2,取出整数部分,直至结果为0为止,最后从上到下写出整数部分,若结果一直不能为零则二进制数陷入无限循环。
while(y2>0)
{
x2[j]=(2*y2)/1; //小数部分乘以2之后的整数部分
y2=2*y2-x2[j];
j++;
}
for(int m=0;m<j;m++)
cout<<x2[m];
最后只需要将两个部分合起来即可,全部代码如下:
#include<iostream>
#include<math.h>
using namespace std;
int main(){
float n;
cin>>n;
int x1[1000],i=0,j=0;
int x2[1000];
double y2;
int y1;
y1=floor(n); //y1为n的整数部分
y2=n-y1; //y2为n的小数部分
while(y1>0)
{
x1[i]=y1%2;
y1=y1/2;
i++;
}
while(y2>0)
{
x2[j]=(2*y2)/1; //小数部分乘以2之后的整数部分
y2=2*y2-x2[j];
j++;
}
for(int m=i-1;m>=0;m--) //m=i-1是因为最后一次i++导致数组比实际所用多出一位
{
cout<<x1[m];
}
cout<<".";
for(int m=0;m<j;m++)
cout<<x2[m];
return 0;
}
十进制转二进制看似简单,但在编程过程中容易出现一些小错误导致最后结果错误,需得小心。