贊賞分享wordpress代碼360優(yōu)化大師官方官網(wǎng)
2020/01/01
- 實(shí)現(xiàn)原理
- 參考代碼
- 測試樣例
- 其他補(bǔ)充
- 后記交流
實(shí)現(xiàn)原理
本程序借助10進(jìn)制數(shù)為中介數(shù)據(jù),實(shí)現(xiàn)任意進(jìn)制數(shù)之間的相互轉(zhuǎn)換(2-36進(jìn)制范圍)
需要注意的是,數(shù)值范圍不可超出 long long int 所表示的范圍,即所輸入需要為正數(shù),且要小于 (2^63) - 1 .(64位處理器計(jì)算機(jī))
若需要負(fù)值數(shù)據(jù),只需要處理第一位的符號位即可.
還有一點(diǎn),本程序的字母表示全部采用了大寫方式,如需要小寫字母形式可自行修改.
其實(shí)也簡單,大小寫ASCLL碼數(shù)值相差32,直接加減即可轉(zhuǎn)換.eg: 'a' - 32 = 'A'.
參考代碼
// 進(jìn)制轉(zhuǎn)換.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。
//#include "pch.h"
#include <iostream>
#include <string>
#include <cmath>
using namespace std;class BaseConversion {
private:const string character = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//從from進(jìn)制數(shù)source轉(zhuǎn)為to進(jìn)制數(shù)result;int from;int to;string source;string result;
public:void init(int from = 10, int to = 2, string source = "1024") {this->from = from;this->to = to;this->source = source;}void computing();int pickIndexNumber(char ch) {if (character.find(ch)!=string::npos) {return character.find(ch);}else {cout << "待轉(zhuǎn)換的數(shù)據(jù)來源不合法,請檢查校正后重新輸入!/n(提示:不可使用負(fù)數(shù)符號開頭)" << endl;}}string getResult() {return result;}
};
void BaseConversion::computing() {int ten = 10;long long num = 0;//轉(zhuǎn)為10進(jìn)制后的數(shù)值結(jié)果if (from > 1 && from < 37) {for (int i = 0; i < source.length(); ++i) {num += pickIndexNumber(source[i])*pow(from, source.length() - i - 1);}cout << "十進(jìn)制數(shù)表示結(jié)果為:" << num << endl;}else {cout << "輸入進(jìn)制有誤,請確保進(jìn)制數(shù)范圍處于[2,36]范圍!" << endl;}if (num < to) {result += character[num];}else {while (num >= to) {result = character[num%to] + result;//如此連接處理則不需要對結(jié)果做逆序處理;num /= to;}result = character[num] + result;//num<to的時(shí)候,作為個(gè)位所在數(shù)值;}
}int main()
{std::ios::sync_with_stdio(false);std::cin.tie(0);int f, t;string s;std::cout << "請輸入從from進(jìn)制轉(zhuǎn)換到to進(jìn)制的數(shù)值source,依次輸入from、to、source:\n(提示:字母請使用大寫形式,且不可使用負(fù)數(shù)符號開頭)" << endl;while(true) {cin >> f >> t >> s;BaseConversion bc;bc.init(f, t, s);bc.computing();cout << s << "(" << f << ") ----> " << bc.getResult() << "(" << t << ")" << endl;}return 0;
}
測試樣例
鼠標(biāo)置于此處可直接預(yù)覽結(jié)果
測試樣例2
其他補(bǔ)充
進(jìn)制轉(zhuǎn)換問題要靈活運(yùn)用,很多時(shí)候并不需要借助10進(jìn)制作為中介.
拋磚引玉:
16進(jìn)制轉(zhuǎn)2進(jìn)制,直接使用四位串流實(shí)現(xiàn)快速轉(zhuǎn)換,即任意一個(gè)16進(jìn)制的位上的數(shù)值可轉(zhuǎn)位對應(yīng)4位二進(jìn)制數(shù)值,采用“8421”快速轉(zhuǎn)換.
同理,32進(jìn)制則使用五位二進(jìn)制串流即可,“16,8,4,2,1”.
反過來:
二進(jìn)制數(shù)轉(zhuǎn)十六進(jìn)制數(shù),可直接采用4位二進(jìn)制化1位十六進(jìn)制實(shí)現(xiàn)快速轉(zhuǎn)換.
本程序?yàn)榱吮阌诶斫庠砗途幋a實(shí)現(xiàn),“符合人性思維”,權(quán)衡之下才用了十進(jìn)制數(shù)作為中介對象.
其實(shí)是可以嘗試直接轉(zhuǎn)換的,只是很難直接理解、思維可能會(huì)不到位.具體內(nèi)容下次更新時(shí)補(bǔ)充.
最后之所以寫這么一個(gè)進(jìn)制轉(zhuǎn)換問題,是因?yàn)樽约杭磳⒖偨Y(jié)密碼編碼學(xué)知識了.
先為異或運(yùn)算(相異為真,C++即1)打個(gè)前站,預(yù)熱一下.
后記交流
以上代碼和文字純屬手工碼字,如有錯(cuò)誤歡迎指出、以便我改正/改進(jìn)代碼.
如需交流,請聯(lián)系QQ/QQ郵箱:2636105163
也可申請加入興趣群聊,956349248,各種福利小彩蛋詳見群資料介紹界面.
2020/01/01 22:44
Franklin