二进制十进制转换
一、二进制:
二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统。
整数部分:
(knkn-1…k2k1)2=(kn×2n-1+kn-1×2n-2+…+k2×21+k1)10
小数部分:
(. k1 k2 …kn-1kn)2=(k1×2-1+k2×2-2+…+kn-1×2-(n-1)+kn×2-n)10
二、十进制转二进制规则:
整数部分:采用"除2取余,逆序排列"法。具体做法是:用2去除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
例如:
(47)10 = (101111)2
(177)10= (1110101)2
C++程序实现十进制无符号整数转二进制:
#include "stdafx.h"
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
void d2b(unsigned int unInput);
int _tmain(int argc, _TCHAR* argv[])
{
unsigned int unInput;
cout<<"请输入一个十进制无符号整数:";
cin>>unInput;
cout<<"("<<unInput<<")10"<<"= (";
d2b(unInput);//十进制转二进制转换
cout<<")2"<<endl;
system("pause");
return 0;
}
//十进制转二进制
void d2b(unsigned int unInput)
{
string szStr;
int nResult = unInput;
do
{
szStr.push_back(nResult%2+ '0');
nResult/= 2;
} while (nResult);
reverse(szStr.begin(),szStr.end());//翻转字符串
cout<<szStr;
}
小数部分:采用"乘2取整,顺序排列"法。具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,此时0或1为二进制的最后一位。或者达到所要求的精度为止。然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位
例如:
(0.625)10 = (0.101)2
(0.725)10 = (0.1011100…)2
C++程序实现十进制无符号整数纯小数转二进制:
#include "stdafx.h"
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
void d2b2(double dInput);
int _tmain(int argc, _TCHAR* argv[])
{
double fInput;
cout<<"请输入一个十进制的纯小数:";
cin>>fInput;
cout<<"("<<fInput<<")10"<<"= (0.";
d2b2(fInput);//十进制转二进制转换
cout<<")2"<<endl;
system("pause");
return 0;
}
//十进制转二进制
void d2b2(double dInput)
{
string szStr;
int nBin = 0;
double dResult = dInput;
// cout<<endl;//注释1
do
{
dResult*= 2;
cout<<dResult;
nBin =floor(dResult);//向下取整 ceil() 向上取整
dResult-= nBin;
szStr.push_back(nBin+ '0');
// cout<<"----"<<dResult<<endl;//注释2
} while (dResult);//注意此处的退出条件。即浮点数的精度控制
cout<<szStr;
}
注意:将上面的注释1和注释2语句打开,观察处理过程,将发现一个秘密:(图中红色标记部分)
0.725转换成二进制数后理论上是一个无线循环数(0011)部分。如
(0.725)10 = (0.10111001100110011001100110011…)2
但计算机计算的结果却是有限位数的。Why?
综合整数和小数,就可以实现任何浮点数的二进制转换。
例如:
(87.322)10 =(1010111.01010010…)2
整数部分:(87)10= (1010111)2
小数部分:(0.322)10 = (0.01010010…)2
C++程序实现十进制无符号浮点数纯小数转二进制数:
/
// 功能:十进制转二进制
// 作者:cbNotes
// 日期:2012/11/20
#include "stdafx.h"
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
using namespace std;
void d2b(double dInput);
void d2b1(unsigned int unInput);
void d2b2(double dInput);
int _tmain(int argc, _TCHAR* argv[])
{
double dInput;
cout<<"请输入一个无符号十进制小数:";
cin>>dInput;
cout<<"("<<dInput<<")10"<<"= (";
d2b(dInput);//十进制转二进制转换
cout<<")2"<<endl;
system("pause");
return 0;
}
//十进制转二进制
void d2b(double dInput)
{
//先将浮点数转换为整数和小数两部分
unsigned int nNum = floor(dInput);//向下取整
double dNum = dInput -nNum;//得到小数部分
d2b1(nNum);
if (dNum)
{
d2b2(dNum);
}
}
//整数部分转换
void d2b1(unsigned int unInput)
{
string szStr;
int nResult = unInput;
do
{
szStr.push_back(nResult%2+ '0');
nResult/= 2;
} while (nResult);
reverse(szStr.begin(),szStr.end());//翻转字符串
cout<<szStr;
}
//小数部分转换
void d2b2(double dInput)
{
string szStr;
int nBin = 0;
double dResult = dInput;
cout<<".";
do
{
dResult*= 2;
nBin =floor(dResult);//向下取整 ceil()向上取整
dResult-= nBin;
szStr.push_back(nBin+ '0');
} while (dResult);//注意此处的退出条件。即浮点数的精度控制
cout<<szStr;
}
三、二进制转十进制
二进制转十进制也分整数部分和小数部分,如下:
• 整数部分:
(knkn-1…k1k0)2=(kn×2n+kn-1×2n-1+…+k1×21+k0×20)10
• 小数部分:
(. k1 k2 …kn-1kn)2=(.k1×2-1+k2×2-2+…+kn-1×2-(n-1)+kn×2-n)10
注意:整数部分和小数部分的起始标号和方向,整数是从0开始的,小数是从-1开始的。
举例1:
(11101101)2
=
=
(K7*27+k6*26+k5*25+k4*24+k3*23+k2*22+k1*21+k0*20)10
=
(1*27+1*26+1*25+0*24+1*23+1*22+0*21+1*20)10
=
(237)10
举例2:
(.11011001)2
=
=
(.k1*2-1+k2*2-2+k3*2-3+k4*2-4+k5*2-5+k6*2-6+k7*2-7+k8*2-8)10
=
(.1*2-1+1*2-2+0*2-3+1*2-4+1*2-5+0*2-6+0*2-7+1*2-8)10
=
(.84765625)10
举例3:
(10110110.01101010)2
=
=
(K7*27+k6*26+k5*25+k4*24+k3*23+k2*22+k1*21+k0*20.k1*2-1+k2*2-2+k3*2-3+k4*2-4+k5*2-5+k6*2-6+k7*2-7+k8*2-8)10
=
(1*27+0*26+1*25+1*24+0*23+1*22+1*21+0*20.0*2-1+1*2-2+1*2-3+0*2-4+1*2-5+0*2-6+1*2-7+0*2-8)10
=
(182.4140625)10
C++程序实现无符号二进制数转十进制数:
/
// 功能:二进制转十进制
// 作者:cbNotes
// 日期:2012/11/20
#include "stdafx.h"
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
void b2d(string szStr);
long b2d1(string nNum);//整数部分转换
double b2d2(string dNum);//小数部分转换
int _tmain(int argc, _TCHAR* argv[])
{
//说明信息
cout<<""<<endl;
cout<<"// //"<<endl;
cout<<"// 二进制转十进制计算 //"<<endl;
cout<<"// //"<<endl;
cout<<"// cbNotes 2012/11/20 //"<<endl;
cout<<""<<endl;
//开始
cout<<"请输入一个二进制数:";
string szstr;
cin>>szstr;
cout<<"("<<szstr<<")2 = (";
b2d(szstr);
cout<<")10"<<endl;
system("pause");
return 0;
}
void b2d(string szStr)
{
//先将二进制数分成整数部分和小数部分
string nStr = szStr,dStr="";
int pos = szStr.find('.');
if (pos!=-1)
{//有小数部分
nStr =szStr.substr(0,pos);//得到整数部分
dStr =szStr.substr(pos+1,szStr.size()-pos-1);//得到小数部分
}
// cout<<endl;
// cout<<"整数部分:"<<nStr<<endl;
// cout<<"小数部分:"<<dStr<<endl;
double dResult = b2d1(nStr)+b2d2(dStr);
cout<<dResult;
}
//整数部分转换
long b2d1(string nNum)
{
long nResult = 0;
for (int i=0;i<nNum.size();i++)
{
nResult+= (nNum[i]-'0')*pow(2.0,i);
}
return nResult;
}
//小数部分转换
double b2d2(string dNum)
{
double nResult = 0.0;
for (int i=0;i<dNum.size();i++)
{
nResult+= (dNum[i]-'0')*pow(2.0,-i-1);
}
return nResult;
}
四、二进制十进制转换完整程序
综合十进制转二进制和二进制转十进制,我编写了一个比较完整的二进制与十进制互转的程序,供大家参考和指正。
功能:实现了二进制与十进制的互转,并能连续操作。
运行效果:
注意:该程序还不完善,还应该加上数据输入正确性的检测,否则将运行出错!
C++程序实现无符号二进制数与十进制数的互转:
// 功能:二进制与十进制的互转
// 作者:cbNotes
// 日期:/11/20
// 网址:http://blog.youkuaiyun.com/cbNotes
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <string>
#include <math.h>
#include <algorithm>
using namespace std;
void d2b(double dInput);//十进制转二进制
void b2d(string szStr); //二进制转十进制
int _tmain(int argc, _TCHAR* argv[])
{
//说明信息
cout<<endl;
cout<<" "<<endl;
cout<<" //===========欢迎你使用该软件!============//"<<endl;
cout<<" // //"<<endl;
cout<<" // 名称:二进制与十进制互转 //"<<endl;
cout<<" // 作者:cbNotes //"<<endl;
cout<<" // 网址:http://blog.youkuaiyun.com/cbNotes //"<<endl;
cout<<" // 日期:/11/20 //"<<endl;
cout<<" // 备注:欢迎大家多提反馈意见和建议! //"<<endl;
cout<<" // //"<<endl;
cout<<" "<<endl;
cout<<endl;
//按键操作
cout<<" 可供选择的操作有:"<<endl;
cout<<endl;
cout<<" 1:十进制转二进制 2:二进制转十进制 q:退出"<<endl;
cout<<endl;
cout<<" >>>请输入你要进行的操作(、、q):";
//按键处理
char chOp;
chOp = getch();
cout<<chOp<<endl;
while(chOp != 'q'&& chOp != 'Q')
{//只要不是退出,就循环处理
while(chOp != '1'&& chOp != '2')
{//判断按键是否为规定的选项,否则重新输入,直到符合要求。
cout<<endl;
cout<<" 【输入错误】:没有该操作选项,只能选择1 或者2 或者q "<<endl;
cout<<endl;
cout<<" >>>请输入你要进行的操作(、、q):";
chOp= getch();
cout<<chOp<<endl;
if (chOp == 'q' || chOp == 'Q')
{//退出
return0;
}
}
cout<<endl;
if (chOp == '1')
{//十进制转二进制
cout<<" =》你要进行的操作为:十进制数转二进制数:"<<endl;
cout<<endl;
cout<<" >>>请输入你要转换的无符号的十进制数:";
doubledInput = 0.0;
cin>>dInput;
cout<<endl;
cout<<" =》转换结果为:("<<dInput<<")10 = (";
d2b(dInput);
cout<<")2"<<endl;
}
else
{//二进制转十进制
cout<<" =》你要进行的操作为:二进制数转十进制数:"<<endl;
cout<<endl;
cout<<" >>>请输入你要转换的二进制数:";
string szInput;
cin>>szInput;
cout<<endl;
cout<<" =》转换结果为:("<<szInput<<")2 = (";
b2d(szInput);
cout<<")10"<<endl;
}
//下次循环处理
cout<<endl;
cout<<"===============================操作完成,下次开始==============================="<<endl;
cout<<" >>>请输入你要进行的操作(、、q):";
chOp =getch();
cout<<chOp<<endl;
}
//退出
return 0;
}
//十进制转二进制
void d2b(double dInput)
{
//先将浮点数转换为整数和小数两部分
unsigned int nNum = floor(dInput);//向下取整
double dNum = dInput -nNum; //得到小数部分
string szStr;
//整数部分转换
do
{
szStr.push_back(nNum%2+ '0');
nNum/= 2;
} while (nNum);
reverse(szStr.begin(),szStr.end());//翻转字符串
//小数部分转换
if (dNum)
{
int nBin = 0;
szStr.push_back('.');
do
{
dNum*= 2;
nBin= floor(dNum);//向下取整 ceil() 向上取整
dNum-= nBin;
szStr.push_back(nBin+ '0');
} while (dNum);//注意此处的退出条件。即浮点数的精度控制
}
cout<<szStr;//输出
}
//二进制转十进制
void b2d(string szStr)
{
//先将二进制数分成整数部分和小数部分
string nStr = szStr,dStr="";
int pos = szStr.find('.');
if (pos!=-1)
{//有小数部分
nStr =szStr.substr(0,pos);//得到整数部分
dStr =szStr.substr(pos+1,szStr.size()-pos-1);//得到小数部分
}
double dResult = 0.0;
//整数部分
for (int i=0;i<nStr.size();i++)
{
dResult+= (nStr[i]-'0')*pow(2.0,i);
}
//小数部分
for (int i=0;i<dStr.size();i++)
{
dResult+= (dStr[i]-'0')*pow(2.0,-i-1);
}
cout<<dResult;
}
程序打包下载地址:
http://download.youkuaiyun.com/detail/cbnotes/4793791
备注:该程序有可能还不完善,欢迎大家测试和修改并及时告知我。欢迎大家发表意见。
转载请说明出处:http://write.blog.youkuaiyun.com/postedit/8221480