• [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进制,按权展开即可;从十进制到任意进制,采用短除法取余数直至商为零.

    短除法示例,十进制数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语块中定义变量.

    运行截图:

     

     

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

  • 相关阅读:
    A1082 Read Number in Chinese [汉字读数字]
    A1077 Kuchiguse [字符串找相同后缀]
    A1035 Password [修改字符]
    A1001 A+B Format [字符串处理]
    django文档总结之会话保持、视图、中间件(2)
    django文档总结之基本操作(1)
    VSCode常用命令快捷键
    vscode配置远程免密
    linux下deb包的管理及制作 | 一次成功
    shell脚本之sed详解(1)
  • 原文地址:https://www.cnblogs.com/Agent-YRBlogs/p/5978443.html
Copyright © 2020-2023  润新知