二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统。
二进制数据也是采用位置计数法,其位权是以2为底的幂。
整数部分:
(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.csdn.net/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.csdn.net/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.csdn.net/detail/cbnotes/4793791
备注:该程序有可能还不完善,欢迎大家测试和修改并及时告知我。欢迎大家发表意见。
转载请说明出处:http://write.blog.csdn.net/postedit/8221480