[C++]实现简单无符号整数进制转换器

2018-06-17 23:40:46来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

     大家好啊,今天为大家带来的是自己实现的用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进制,按权展开即可;从十进制到任意进制,采用短除法取余数直至商为零.

短除法示例,十进制数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 
 13     string hexStr(0.75 * limit, ' ');   //目标字符串预留出一定空间,16进制数位数为对应10进制数的3/4,调用string类的构造函数
 14     int Value = 0;                                       //Value保存每次短除法的余数
 15     int i = 0;
 16 
 17     if ( deci < 10)                                      //待转换数小于10时,16和10进制表示方法相同
 18         return string(1, (char)deci);
 19 
 20     for (; deci != 0; ++i, deci /= 16)            //短除法循环
 21     {
 22         Value = deci % 16;
 23 
 24         switch (Value)                                //多分支选择表示10~15的字母
 25         {
 26             case 10 :
 27                 hexStr.at(i) = 'A';
 28                 break;
 29 
 30             case 11 :
 31                 hexStr.at(i) = 'B';
 32                 break;
 33 
 34             case 12 :
 35                 hexStr.at(i) = 'C';
 36                 break;
 37 
 38             case 13 :
 39                 hexStr.at(i) = 'D';
 40                 break;
 41 
 42             case 14 :
 43                 hexStr.at(i) = 'E';
 44                 break;
 45 
 46             case 15 :
 47                 hexStr.at(i) = 'F';
 48                 break;
 49 
 50             default :
 51                 hexStr.at(i) =  Value + '0';     //用数字表示的要将数字转化为对应的字符
 52         }
 53     }
 54 
 55     hexStr = hexStr.substr(0, i);                      //取有字符的字串
 56 
 57     reverse(hexStr.begin(), hexStr.end());       //使用迭代器反转字符串,因为写入的高低位颠倒
 58 
 59     return hexStr;                                          //返回对应的16进制数字符串
 60 }
 61 
 62 string deciToOct(unsigned deci)                                //10进制转8进制函数,结构类似于上
 63 {
 64 
 65     string hexStr(limit, ' ');
 66     int Value = 0;
 67     int i = 0;
 68 
 69     if ( deci < 8)
 70         return string(1, (char)deci);
 71 
 72     for (; deci != 0; ++i, deci /= 8)
 73     {
 74         Value = deci % 8;
 75         hexStr.at(i) =  Value + '0';
 76     }
 77 
 78     hexStr = hexStr.substr(0, i);
 79 
 80     reverse(hexStr.begin(), hexStr.end());
 81 
 82     return hexStr;
 83 }
 84 
 85 string deciToBin(unsigned deci)                                //10进制转2进制函数,结构类似于上
 86 {
 87 
 88     string hexStr(3 * limit, ' ' );
 89     int Value = 0;
 90     int i = 0;
 91 
 92     for (; deci != 0; ++i, deci /= 2)
 93     {
 94         Value = deci % 2;
 95         hexStr.at(i) =  Value + '0';
 96     }
 97 
 98     hexStr = hexStr.substr(0, i);
 99 
100     reverse(hexStr.begin(), hexStr.end());
101 
102     return hexStr;
103 }
104 
105 long anyToDeci(const string any, const unsigned scale)              //按权展开函数
106 {
107 
108     long sum = 0;                                                     //sum为累加和
109     int n = any.length();                                            //使用string类的方法获得字符串长度
110 
111     for (int i = 0; i < n; i++)
112         if (any.at(i) >= '0' && any.at(i) <= '9')
113             sum += (any.at(i) - '0') * pow(scale, n - 1 - i);    //按权展开的幂乘和累加
114         else  if (any.at(i) >= 'a' && any.at(i) <= 'f')          //对16进制用字母表示的数的处理
115             sum +=  (any.at(i) - 'a' + 10) * pow(scale, n - 1 - i);
116         else
117             sum +=  (any.at(i) - 'A' + 10) * pow(scale, n - 1 - i);
118 
119     return sum;
120 }
121 
122 
123 #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 
10     system("color 3F");                   //设置控制台窗口背景色和前景色
11 
12     int k = 0;
13     unsigned deci = 0;                  //输入的10进制数
14     extern string deciToHex(unsigned);
15     extern string deciToOct(unsigned);
16     extern string deciToBin(unsigned);
17     extern long anyToDeci(string, unsigned);       //函数原型
18     string any("");                         //预留的空字符串
19     unsigned scale = 0;                  //进制标识
20 
21     cout << "无符号整数数制转换器" << endl;
22     cout << "By Alexios Yan" << endl;
23     cout << endl;
24 
25     while (true)                                                  //无限循环功能菜单
26     {
27         cin.sync();                                                     //清空输入缓冲区
28         cout << "按任意键继续" << endl;
29         cin.get();                                                        //读取一个字符
30         system("cls");                                               //清屏
31         cout << "功能列表:" << endl;
32         cout << "0. 退出" << endl;
33         cout << "1. 10进制到16进制" << endl;
34         cout << "2. 10进制到8进制" << endl;
35         cout << "3. 10进制到2进制" << endl;
36         cout << "4. 2或8或16进制到10进制" << endl;
37         cout << endl;
38         cout << "请选择:" << endl;
39         cin >> k;
40 
41         switch (k)                                       //根据选择调用不同函数
42         {
43             case 0 :
44                 exit(EXIT_SUCCESS);
45                 break;
46 
47             case 1 :
48                 cout << "请输入需要转换的10进制数(不多于" << limit - 1 << "位):" << endl;
49                 cin >> deci;
50                 cout << "对应的16进制数是0x" << deciToHex(deci) << endl;
51                 cout << endl;
52                 break;
53 
54             case 2 :
55                 cout << "请输入需要转换的10进制数(不多于" << limit - 1 << "位):" << endl;
56                 cin >> deci;
57                 cout << "对应的8进制数是0" << deciToOct(deci) << endl;
58                 cout << endl;
59                 break;
60 
61             case 3 :
62                 cout << "请输入需要转换的10进制数(不多于" << limit - 1 << "位):" << endl;
63                 cin >> deci;
64                 cout << "对应的2进制数是0b" << deciToBin(deci) << endl;
65                 cout << endl;
66                 break;
67 
68             case 4 :
69                 cout << "请输入需要转换到10进制的数:" << endl;
70                 cin >> any;
71                 cout << "请输入该数的进制:" << endl;
72                 cin >> scale;
73                 cout << "结果是" << anyToDeci(any, scale) << endl;
74                 cout << endl;
75                 break;
76 
77             default :
78                 cout << "选择错误,请重新选择" << endl;
79                 cout << endl;
80                 break;
81         }
82     }
83 
84     return 0;
85 }

 

 

 

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

运行截图:

 

 

 

 

 

本人原创,转载请注明出处,谢谢合作!

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:静态库和动态库的区别

下一篇:重载 &amp;&amp; 重载递增递和减运算符