二进制十进制转换

二进制十进制转换

一、二进制:

二进制是计算技术中广泛采用的一种数制二进制数据是用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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值