[代码范例]用C++实现的简单无符号整数进制转换器

[代码实例]用C++实现的简单无符号整数进制转换器

     大家好啊,今天为大家带来的是自己实现的用C++编写的简单进制转换器,用于10进制数和8进制数,16进制数,2进制数的相互转换.

      首先,说明一下什么是进制.n进制就是一种用来表示数值的方法,n进制,顾名思义,逢n进1.我们日常生活中使用的基本都是10进制数,逢10进1;现代计算机处理器所能处理的只能是2进制数,虽然好像前苏联曾经尝试研制10进制计算机,最后当然无疾而终.

      计算机使用2进制的原因是它实现简单,仅有0和1两个码元,又和自然世界某些事物的两种状态相对应(比如开关的开和断开,电平的高和低等).在我们记录和汇编语言的编写中,常常使用16进制数,便于书写,因为一个16进制数对应4个2进制数.一个8进制数对应3个2进制数,而一个10进制数对应4个2进制数,存在6个冗余码.在高级程序设计语言中,2进制,8进制,16进制分别用0b,0,0x作为前缀表示,如0xB2代表10进制数178.在汇编语言中,用B,O,H作为作为后缀表示,如30H代表十进制数48,同时也是字符'0'的ASCII码.

      实现该小程序的关键是数制转换算法.无符号整数从任意进制到10进制,按权展开即可;从十进制到任意进制,采用短除法取余数直至商为零.

[代码范例]用C++实现的简单无符号整数进制转换器短除法示例,十进制数53对应二进制数0b110101

     下面进入正题,整个工程由自定义头文件convertfuncs.h和源程序文件main.cpp构成,代码如下:

    convertfuncs.h:

     

 1 #ifndef CONVERTFUNCS_H_INCLUDED
 2 #define CONVERTFUNCS_H_INCLUDED                      //包含警戒
 3 
 4 #include<iostream>
 5 
 6 using namespace std;
 7 
 8 const unsigned limit = (unsigned)(sizeof(unsigned)*8*0.3+1);  //限定可处理的10进制数最多位数,由机器实现决定
 9 
10 string deciToHex(unsigned deci) {                              //10进制转16进制函数
11 
12     string hexStr(0.75*limit, ' ');     //目标字符串预留出一定空间,16进制数位数为对应10进制数的3/4,调用string类的构造函数
13     int Value=0;                                         //Value保存每次短除法的余数
14     int i = 0;
15 
16     if( deci < 10)                                       //待转换数小于10时,16和10进制表示方法相同
17         return string(1,(char)deci);
18 
19    for(; deci != 0; ++i, deci /= 16) {           //短除法循环
20         Value = deci%16;
21         switch(Value) {                               //多分支选择表示10~15的字母
22            case 10 :hexStr.at(i) = 'A'; break;
23            case 11 :hexStr.at(i) = 'B'; break;
24            case 12 :hexStr.at(i) = 'C'; break;
25            case 13 :hexStr.at(i) = 'D'; break;
26            case 14 :hexStr.at(i) = 'E'; break;
27            case 15 :hexStr.at(i) = 'F'; break;
28            default :hexStr.at(i) =  Value+'0';       //用数字表示的要将数字转化为对应的字符
29        }
30     }
31     hexStr=hexStr.substr(0, i);                        //取有字符的字串
32 
33     reverse(hexStr.begin(), hexStr.end());       //使用迭代器反转字符串,因为写入的高低位颠倒
34 
35     return hexStr;                                          //返回对应的16进制数字符串
36 }
37 
38 string deciToOct(unsigned deci) {                              //10进制转8进制函数,结构类似于上
39 
40     string hexStr(limit, ' ');
41     int Value=0;
42     int i = 0;
43 
44     if( deci < 8)
45         return string(1,(char)deci);
46 
47    for(; deci != 0; ++i, deci /= 8) {
48         Value = deci%8;
49        hexStr.at(i) =  Value+'0';
50     }
51 
52     hexStr=hexStr.substr(0, i);
53 
54     reverse(hexStr.begin(), hexStr.end());
55 
56     return hexStr;
57 }
58 
59 string deciToBin(unsigned deci) {                              //10进制转2进制函数,结构类似于上
60 
61     string hexStr(3*limit, ' ' );
62     int Value=0;
63     int i = 0;
64 
65     for(; deci != 0; ++i, deci /= 2) {
66         Value = deci%2;
67        hexStr.at(i) =  Value+'0';
68     }
69 
70     hexStr=hexStr.substr(0, i);
71 
72     reverse(hexStr.begin(), hexStr.end());
73 
74     return hexStr;
75 }
76 
77 long anyToDeci(string any, unsigned scale){             //按权展开函数
78 
79      long sum = 0;                                                     //sum为累加和
80      int n = any.length();                                            //使用string类的方法获得字符串长度
81 
82     for(int i = 0; i < n; i++)
83         if(any.at(i) >= '0' && any.at(i) <= '9')
84             sum += (any.at(i) - '0')* pow(scale, n-1-i);         //按权展开的幂乘和累加
85         else  if(any.at(i) >= 'a' && any.at(i) <= 'f')           //对16进制用字母表示的数的处理
86                     sum +=  (any.at(i) - 'a'+10)* pow(scale, n-1-i);
87                 else
88                     sum +=  (any.at(i) - 'A'+10)* pow(scale, n-1-i);
89       return sum;
90 }
91 
92 #endif // CONVERTFUNCS_H_INCLUDED

limit是输入的十进制数最多位数.若sizeof(unsigned)在某机器上为4,即无符号整数占用4Byte,也即32位,最大数为232,根据210≈103,有220≈106  ,230≈109,因此232至少用10位10进制数表示,因此输入的十进制数最多10位.

 

main.cpp:

 1 #include<iostream>
 2 #include<algorithm>                    //reverse函数声明在次头文件中
 3 #include"convertfuncs.h"             //自定义头文件
 4 
 5 using namespace std;
 6 
 7 int main(){
 8 
 9      system("color 3F");                   //设置控制台窗口背景色和前景色
10 
11      int k = 0;
12      unsigned deci = 0;                  //输入的10进制数
13      extern string deciToHex(unsigned);
14      extern string deciToOct(unsigned);
15      extern string deciToBin(unsigned);
16      extern long anyToDeci(string, unsigned);       //函数原型
17      string any = "";                         //预留的空字符串
18      unsigned scale=0;                    //进制标识
19 
20     cout<<"无符号整数数制转换器"<<endl;
21     cout<<"By Alexios Yan"<<endl;
22     cout<<endl;
23 
24      while(true){                                                  //无限循环功能菜单
25     cin.sync();                                              //清空输入缓冲区
26     cout<<"按任意键继续"<<endl;
27     cin.get();
28      system("cls");                                        //清屏
29      cout<<"功能列表:"<<endl;
30      cout<<"0. 退出"<<endl;
31      cout<<"1. 10进制到16进制"<<endl;
32      cout<<"2. 10进制到8进制"<<endl;
33      cout<<"3. 10进制到2进制"<<endl;
34      cout<<"4. 2或8或16进制到10进制"<<endl;
35      cout<<endl;
36      cout<<"请选择:"<<endl;
37      cin>>k;
38 
39      switch(k){                                       //根据选择调用不同函数
40      case 0 : exit(0);
41                   break;
42      case 1 : cout<<"请输入需要转换的10进制数(不多于"<<limit-1<<"位):"<<endl;
43                   cin>>deci;
44                   cout<<"对应的16进制数是0x"<<deciToHex(deci)<<endl;
45                   cout<<endl;
46                   break;
47      case 2 : cout<<"请输入需要转换的10进制数(不多于"<<limit-1<<"位):"<<endl;
48                   cin>>deci;
49                   cout<<"对应的8进制数是0"<<deciToOct(deci)<<endl;
50                   cout<<endl;
51                   break;
52      case 3 : cout<<"请输入需要转换的10进制数(不多于"<<limit-1<<"位):"<<endl;
53                   cin>>deci;
54                   cout<<"对应的2进制数是0b"<<deciToBin(deci)<<endl;
55                   cout<<endl;
56                   break;
57      case 4 : cout<<"请输入需要转换到10进制的数:"<<endl;
58                  cin>>any;
59                  cout<<"请输入该数的进制:"<<endl;
60                  cin>>scale;
61                  cout<<"结果是"<<anyToDeci(any, scale)<<endl;
62                  cout<<endl;
63                  break;
64      default : cout<<"选择错误,请重新选择"<<endl;
65                    cout<<endl;
66                    break;
67         }
68      }
69      return 0;
70 }

本工程在GCC编译器下编译通过,成功运行.在GCC编译器在,不允许在switch语块中定义变量.

运行截图:

[代码范例]用C++实现的简单无符号整数进制转换器

 

 

 [代码范例]用C++实现的简单无符号整数进制转换器

[代码范例]用C++实现的简单无符号整数进制转换器

 [代码范例]用C++实现的简单无符号整数进制转换器

[代码范例]用C++实现的简单无符号整数进制转换器

 

谢谢大家!转载请注明出处,谢谢合作!

1楼大大维
高产啊