二进制十进制转换

二进制十进制转换

一、二进制:

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

 

备注:该程序有可能还不完善,欢迎大家测试和修改并及时告知我。

欢迎大家发表意见。

 

转载请说明出处:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值