csp基礎之進制轉換器

一、進制轉換要明白的基礎知識。。。

1、什么是進制? 進制也就是進位計數制,是人為定義的帶進位的計數方法。對于任何一種進制 X 進制,就表示每一位置上的數運算時都是逢 X 進一位。十進制是逢十進一,十六進制是逢十六進一,二進制就是逢二進一,以此類推,x 進制就是逢 x 進位。

2、生活中常見的進制有哪些? 10 進制、60 進制、12 進制、24 進制等;

3、n 進制如何數數?

10 進制:0 1 2 3 4 5 6 7 8 9 10 11……

? 2 進制:0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 10000……

? 8?進制:0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21……

16 進制:0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E? ……

4、常見進制的表示與區分 0b\0o\0x

int a = 0b10101; ? ?// 二進制數字,10101(等于十進制的21)
int b = 0o123456; ? // 八進制數字,123456(等于十進制的42798)
int c = 0x123456A; ?// 十六進制數字,123456A(等于十進制的19088746)


?二、圖示更清楚吧。。。

下面的圖示以及后面的代碼包含了所有進制轉換的規律和方法,是我現在所學會的方法的一個總結整理,后面如果學會了其他更簡潔方便的方法還要補充上的。。。

三、代碼分析與講解。。。

1. R-->10 按權展開

//2--10 十入按權展 
int to_D(){string s;//接收R進制字符 cin>>s;//getline(cin,s);int R,Q=1;//起始進制數 和 權重 cin>>R;int re=0;//10進制數字 reverse(s.begin(),s.end());for(char c:s){if(c>='A') re+=(c-'A'+10)*Q;//可能是16進制的字符 else re+=(c-'0')*Q;Q=Q*R; }return re; 
}

簡單方法:

后面發現有一個函數可以把【任意進制的字符串】轉為【十進制整數】,一行抵十幾行。。。

long long d=stoll(s, nullptr, base);??//base是任意進制 ,還有 stoi()\stof()


?2. 10-->R 短除取倒余

//10--2 十出短除倒余 
string D_to(){int n;//大數用ll cin>>n;//接收10進制數字 int R;//目標進制cin>>R;string re;//R進制結果 while(n){int x = n%R;char c = (x >= 10) ? (x - 10 +'A') : (x+'0');re = c + re;n = n/R;}return (re.empty())? "0":re;
}

簡單方法:

后面也發現了一個函數10——>8/16的,3行抵十幾行...

stringstream ss;
ss << hex << d; ?// 十進制d → 十六進制字符串hex(不帶 0x)—>ss

cout << ss.str() << endl; ?// 輸出:1a3(小寫)可用?uppercase 控制輸出為大寫

10——>2:

cout << bitset<8>(d) << endl; ?// 輸出:00001101(只能是8/16),不可逆的轉換


3.? R-->2 映射后拼接去0

// 16--2 二入映射后拼接 (補/刪前導0)
string to_B(){string s;//接收R進制字符 cin>>s;//getline(cin,s);int Q=1,R;//權重和起始進制數 string re;//二進制unordered_map<char,string> RTB16= //16進制映射表 {	{'0', "0000"}, {'1', "0001"}, {'2', "0010"}, {'3', "0011"},{'4', "0100"}, {'5', "0101"}, {'6', "0110"}, {'7', "0111"},{'8', "1000"}, {'9', "1001"}, {'A', "1010"}, {'B', "1011"},{'C', "1100"}, {'D', "1101"}, {'E', "1110"}, {'F', "1111"}}; 
//  vector<string> RTB8= //8進制映射表 
//	{"000","001","010","011",
//	 "100","101","110","111"
//	};//其余的按照規律寫映射 for(char c:s) {re+=RTB16[c];
//    	re+=RTB8[c-'0'];//8進制 }while(re.size()>0&&re[0]=='0')//刪除前導0 方法1 直接刪除 re.erase(0,1);//	int i;
//	for(i=0;i<re.size()&&re[i]=='0';i++);//刪除前導0 方法2 定位獲得子串 
//	re=re.substr(i);return re;
}

4. 2-->R 補0三四展去0

//2--16 二出補0三四展(補/刪前導0)
string B_to(){string s;//接收二進制字符 cin>>s;//getline(cin,s);int Q=1,R;//目標進制數 string re;//R進制int cnt8=(3-s.size()%3)%3;//轉成八進制的補0個數 
//	int cnt16=(4-s.size()%4)%4;//轉成十六進制的補0個數 s=string(cnt8,'0')+s;for(int i=0;i<s.size();i+=3) //或者是 i+=4 {int x=(s[i]-'0')*4 + (s[i+1]-'0')*2 + (s[i+2]-'0')*1;char c = (x >= 10) ? (x - 10 +'A') : (x+'0');re+=c;}int i;for(i=0;i<re.size()&&re[i]=='0';i++);//刪除前導0 方法2 re=re.substr(i);return re;
}

?5. 8--10--16 按權展+短除取倒余

//8--10--16,短數 轉10按權用短除 
string R_D_R(){string s;//接收R1進制字符 cin>>s;//getline(cin,s);int Q=1,R1=8;//權重和起始進制數 int re=0;//10進制數字 
//【按權】	reverse(s.begin(),s.end());for(char c:s){if(c>='A') re+=(c-'A'+10)*Q;//可能是16進制的字符 else re+=(c-'0')*Q;Q=Q*R1; }
//	cout<<re<<endl;//10進制數 int n=re; int R2=16;//目標進制string r;//R2進制結果 
//【短除】	while(n){int x=n%R2;char c = (x >= 10) ? (x - 10 +'A') : (x+'0');r = c+r;n=n/R2;}return (r.empty())? "0":r;
}

6. 16--2--8 映射拼接去0+補0展開

//16--2--8 ,長數 轉2映射補0展 
string R_B_R() { 
//【映射】 vector<string> h_b = {"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};string h, b, o;//16\2\8 cin >> h;for(char c : h) { // 16 -> 2if (c >= 'A') b += h_b[c - 'A' + 10];else b += h_b[c - '0'];}// 去掉前導0while(b.size() > 0 && b[0] == '0') {b.erase(0, 1);}
//【補0】 int cnt = (3 - b.size() % 3) % 3;b = string(cnt, '0') + b;
//【展】 for (int i = 0; i < b.size(); i += 3) { // 2 -> 8int x = (b[i] - '0') * 4 + (b[i+1] - '0') * 2 + (b[i+2] - '0');o += x + '0';}// 去掉前導0while (o.size() > 0 && o[0] == '0') {o.erase(0, 1);}return o;
}

可以看出來,在涉及到2進制轉換的時候,都要進行去除前導0的操作,因此可以用一個封裝函數實現去除字符串的前導0。。。

刪除前導0函數

//刪除前導0的函數
string remove0(string s) {size_t pos = s.find_first_not_of('0');//找到第一個不是0的位置 return (pos != string::npos) ? s.substr(pos) : "0";
}//在去除前導0時調用remove0()函數
re=remove0(re);


四、任意進制轉換函數(S)M-->(?)N

輸入:

M N(int)

S(string)

輸出:

?(string)

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;// 將M進制字符串S轉為十進制整數d
long long to_D(const string& s, int M) {long long d = 0;long long Q = 1;//權重 for (int i = s.size() - 1; i >= 0; --i) {char c = toupper(s[i]);int x = (c >= 'A')?  (c - 'A' + 10 ):  (c - '0');d += x * Q;Q =Q * M;}return d;
}// 將十進制整數d轉為N進制字符串
string D_to(long long d, int N) {if (d == 0) return "0";string re;while (d > 0) {int x = d % N;char c = (x >= 10) ? (x - 10 + 'A') : (x + '0');re = c + re;d /= N;}return re;
}int main() {//(S)M-->(?)Nint M, N;//兩個進制數字 string S;//M進制的數字 cin >> M >> N >> S;long long d = to_D(S, M);         // M → 10string re = D_to(d, N);     // 10 → Ncout << re << endl;return 0;
}

總結:以上實現了各類進制的轉換,涉及到一般數據范圍和超大數據范圍的數據處理。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88669.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88669.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88669.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Zephyr OS藍牙廣播(Advertising)功能實現

目錄 概述 1 Advertising功能介紹 1.1 實現原理 1.2 廣播類型 1.3 廣播數據格式 1.4 優化建議 1.5 常見問題和解決方法 2 Nordic 藍牙廣播&#xff08;Advertising&#xff09;功能實現 2.1 環境準備與SDK基礎 2.2 廣播功能實現 2.3 廣播優化與最佳實踐 3 實際應用案例…

服務器不支持PUT,DELETE 的解決方案

nginx 的更改&#xff1a; set $method $request_method; if ($http_X_HTTP_Method_Override ~* PUT|DELETE) { set $method $http_X_HTTP_Method_Override; } proxy_method $method; axios 的更改&#xff1a; const method config.me…

從0開始學習計算機視覺--Day04--線性分類

從宏觀來看&#xff0c;卷積網絡可以看做是由一個個不同的神經網絡組件組合而成&#xff0c;就像積木一樣通過不同類型的組件搭建形成&#xff0c;其中線性分類器是一個很重要的組件&#xff0c;在很多卷積網絡中都有用到&#xff0c;所以了解清楚它的工作原理對我們后續的學習…

基于ComfyUI與Wan2.1模型的本地化視頻生成環境搭建指南

文章目錄 前言1.軟件準備1.1 ComfyUI1.2 文本編碼器1.3 VAE1.4 視頻生成模型2.整合配置3. 本地運行測試4. 公網使用Wan2.1模型生成視頻4.1 創建遠程連接公網地址5. 固定遠程訪問公網地址總結前言 各位小伙伴們,今天我們將為您展示一套創新的人工智能應用方案!本次教程將指導…

Vue 2 項目中內嵌 md 文件

推薦方案&#xff1a;raw-loader marked 解析 Markdown 第一步&#xff1a;安裝依賴 npm install marked --save npm install raw-loader --save-dev第二步&#xff1a;配置 webpack 支持 .md 文件 打開 vue.config.js 或 webpack.config.js&#xff0c;添加以下配置&#…

Spring AI初識及簡單使用,快速上手。

Spring AI簡介 在當今這樣一個快速發展的技術時代&#xff0c;人工智能&#xff08;AI&#xff09;已經成為各行各業的一種標配。而作為一款主流的Java應用開發框架Spring&#xff0c;肯定會緊跟時代的潮流&#xff0c;所以&#xff0c;推出了Spring AI框架。 官網描述&#…

Flask中的render_template與make_response:生動解析與深度對比

文章目錄 Flask中的render_template與make_response&#xff1a;生動解析與深度對比一、&#x1f31f; 核心概念速覽二、&#xfffd; render_template - 網頁內容的主廚特點與內部機制適用場景高級用法示例 三、&#x1f381; make_response - 響應的包裝專家核心功能解析適用…

WordPress目錄說明

在WordPress建站過程中&#xff0c;理解服務器目錄結構是非常重要的。以下是一個基礎的WordPress服務器目錄指南&#xff1a; /wp-admin/ &#xff1a;這個目錄包含了WordPress網站的所有管理功能&#xff0c;包括用于處理網站后臺的所有PHP文件。 /wp-includes/ &#xff1a;…

HTTP面試題——緩存技術

目錄 HTTP緩存技術有哪些&#xff1f; 什么是強制緩存&#xff1f; 什么是協商緩存&#xff1f; HTTP緩存技術有哪些&#xff1f; 對于一些具有重復性的HTTP請求&#xff0c;比如每次請求得到的數據都是一樣的&#xff0c;我們可以把這對 請求-響應的數據都緩存在本地&#x…

virtual box 不能分配 USB設備 IFX DAS JDS TriBoard TC2X5 V2.0 [0700] 到虛擬電腦 win10

VirtualBox: Failed to attach the USB device to the virtual machine – Bytefreaks.net ISSUE&#xff1a; virtual box 不能分配 USB設備 IFX DAS JDS TriBoard TC2X5 V2.0 [0700] 到虛擬電腦 win10. USB device IFX DAS JDS TriBoard TC2X5 V2.0 with UUID {91680aeb-e1…

Deepoc大模型重構核工業智能基座:混合增強架構與安全增強決策技術?

面向復雜系統的高可靠AI賦能體系構建 Deepoc大模型通過多維度技術突破&#xff0c;顯著提升核工業知識處理與決策可靠性。經核能行業驗證&#xff0c;其生成內容可驗證性提升68%&#xff0c;關鍵參數失真率<0.3%&#xff0c;形成覆蓋核能全鏈條的定制化方案&#xff0c;使企…

第12章:冰箱里的CT掃描儀——計算機視覺如何洞穿食材的“生命密碼“

第11章:冰箱里的CT掃描儀——計算機視覺如何成為食材健康的"超級診斷官" “糟了!冰箱里草莓長出了白色絨毛,雞胸肉滲出了可疑的粉紅色液體!” 這揭示了廚房生存的更基本挑戰:如何像經驗豐富的主廚一樣,一眼洞穿食材的健康密碼? 本章將揭示計算機視覺技術如何賦…

虛幻基礎:窗口——重定向

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄 重定向&#xff1a;給骨架添加兼容骨架。使得不同模型間復用動畫資源 重定向&#xff1a;給骨架添加兼容骨架。使得不同模型間復用動畫資源

CSS 逐幀動畫

CSS 逐幀動畫實現指南 逐幀動畫(frame-by-frame animation)是一種通過快速連續顯示一系列靜態圖像來創造運動效果的技術。以下是使用CSS實現逐幀動畫的幾種方法。 1. 使用 steps() 計時函數 這是實現逐幀動畫最常用的方法&#xff0c;通過animation-timing-function的steps(…

高版本IDEA如何開發低版本jdk項目

問題描述 我這個人比較喜歡新的東西&#xff0c;比如使用idea的時候&#xff0c;我就喜歡最新版本。 但是有個問題&#xff0c;最新版本的idea好像不支持jdk1.6&#xff0c;導致我無法去用新版本idea開發項目。 直到有一天&#xff0c;idea給了我一個提示如下&#xff0c;之…

Java設計模式->責任鏈模式的介紹

目錄 1、責任鏈模式概念 1.1、定義介紹 1.2、流程圖 1.3、優缺點 2、實現 3、應用場景 3.1、Springmvc流程 3.2、mybatis的執行流程 3.3、Spring的過濾器和攔截器 3.4、sentinel限流熔斷 3.5、aop的加載和使用 4、舉例 前言 是一種 行為型設計模式&#xff0c;它通…

【Bluedroid】藍牙啟動之 btm_acl_device_down 流程源碼解析

本文詳細分析Android藍牙協議棧在設備故障時的處理流程。當藍牙設備發生硬件故障或系統異常時,協議棧通過btm_acl_device_down觸發多層次的資源清理和狀態重置,包括ACL連接終止、L2CAP通道釋放、SCO連接清理、BLE拓撲更新、設備數據庫重置等關鍵操作,確保系統安全恢復。 一、…

隨記:WebMvcConfigurationSupport 和WebMvcConfigurer 的區別

WebMvcConfigurationSupport &#xff08;抽象類&#xff09; 他是一個完整的 MVC 配置基類&#xff0c;他會禁用所有自動配置。默認靜態資源映射也沒有了。默認消息轉換器&#xff08;json、xml&#xff09;也沒有了。錯誤處理頁默認的error也沒有了。 WebMvcConfigurer &am…

npm run dev報錯

1. 引言 1.1 什么是npm run dev npm run dev 是一個在 Node.js 項目中常用的命令&#xff0c;它允許開發者運行一個預定義的腳本&#xff0c;通常用于啟動開發服務器或者執行開發環境的構建任務。這個命令是通過 package.json 文件中的 scripts 部分定義的&#xff0c;例如&…

Kotlin環境搭建與基礎語法入門

目標&#xff1a;完成開發環境配置&#xff0c;編寫第一個Kotlin程序&#xff0c;理解變量、數據類型和基本輸出。 1. 環境搭建 步驟1&#xff1a;安裝JDK 下載并安裝 JDK 17&#xff08;Kotlin兼容性最佳版本&#xff09;。 配置環境變量 JAVA_HOME&#xff0c;并在終端驗證…