[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語塊中定義變量.

運行截圖:

 

 

 

 

 

本人原創,轉載請注明出處,謝謝合作!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM