[代碼實例]用C++實現的簡單無符號整數進位轉換器

来源:http://www.cnblogs.com/Agent-YRBlogs/archive/2016/10/19/5978443.html
-Advertisement-
Play Games

大家好啊,今天為大家帶來的是自己實現的用C++編寫的簡單進位轉換器,用於10進位數和8進位數,16進位數,2進位數的相互轉換. 首先,說明一下什麼是進位.n進位就是一種用來表示數值的方法,n進位,顧名思義,逢n進1.我們日常生活中使用的基本都是10進位數,逢10進1;現代電腦處理器所能處理的只能是 ...


     大家好啊,今天為大家帶來的是自己實現的用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     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語塊中定義變數.

運行截圖:

 

 

 

 

 

謝謝大家!轉載請註明出處,謝謝合作!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 內置對象:不需要預先聲明就可以在腳本代碼和表達式中隨意使用,有以下特點 1.由JSP規範提供,不用編寫者實例化 2.提供Web容器實現和管理 3.所有JSP頁面均可用 4.只有在腳本元素的表達式或者代碼中才可使用(<%=使用內置對象%>或<%使用內置對象%>) 輸入輸出對象:request,resp ...
  • JavaWeb_day01 HTTP協議 HTTP(HyperText Transfer Protocol)超文本傳輸協議,是TCP/IP的應用層協議,用於定義WEB瀏覽器與WEB伺服器之間交換數據的過程以及數據本身的格式. Http協議版本號 : HTTP/1.0 HTTP/1.1 交互步驟 : ...
  • JList想添加元素,可以執行將所有元素在JList初始化時加入的靜態操作,也可以利用“列表模型”DefaultListModel處理所有列表修改細節的動態操作。 ...
  • Java Labmda表達式的一個重要用法是簡化某些匿名內部類(Anonymous Classes)的寫法。實際上Lambda表達式並不僅僅是匿名內部類的語法糖,JVM內部是通過invokedynamic指令來實現Lambda表達式的。本篇我們首先感受一下使用Lambda表達式帶來的便利之處。 ...
  • 筆者在一家互聯網公司做JavaEE開發,公司開發了移動端的產品,唯獨沒有PC端的產品,於是領導將任務分配給筆者。 使用Java開發PC客戶端,我的第一反應是使用swing API。但是,產品的需求是客戶端內嵌一個瀏覽器引擎,能夠渲染網頁內容。於是,筆者通過百度無意間發現和瞭解到JavaFX。 經過編 ...
  • 一、 hibernate是什麼 (一)hibernate 是一個orm框架,orm (object relation mapping) 對象關係映射框架 o object -> 業務層(只對對象操作) r relation-> 關係資料庫 m mapping 對象關係映射文件 Hibernate有六 ...
  • 一、插入排序 1 #-*- coding:utf-8 -*- 2 ''' 3 描述 4 插入排序的基本操作就是將一個數據插入到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據,演算法適用於少量數據的排序,時間複雜度為O(n^2)。 5 是穩定的排序方法。插入演算法把要排序的數組分成兩部分:第 ...
  • 轉載於:http://www.cnblogs.com/767355675hutaishi/p/3873770.html 題目大意:眾所周知冒泡排序演算法多數情況下不能只掃描一遍就結束排序,而是要掃描好幾遍。現在你的任務是求1~N的排列中,需要掃描K遍才能排好序的數列的個數模20100713。註意,不同 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...