C++如何將十六進(jìn)制字符串轉(zhuǎn)換為二進(jìn)制字符串
十六進(jìn)制字符串轉(zhuǎn)換為二進(jìn)制字符串
一種簡(jiǎn)單的方法將十六進(jìn)制字符串轉(zhuǎn)為二進(jìn)制字符串,不限制十六進(jìn)制的字節(jié)數(shù)。
源代碼
傳入的十六進(jìn)制字符串需要轉(zhuǎn)換為大寫!(%X, toupper())。
string GetBinaryStringFromHexString (string strHex) { string sReturn = ""; unsigned int len = strHex.length(); for (unsigned int i = 0; i<len; i++) { switch ( strHex[i]) { case '0': sReturn.append ("0000"); break; case '1': sReturn.append ("0001"); break; case '2': sReturn.append ("0010"); break; case '3': sReturn.append ("0011"); break; case '4': sReturn.append ("0100"); break; case '5': sReturn.append ("0101"); break; case '6': sReturn.append ("0110"); break; case '7': sReturn.append ("0111"); break; case '8': sReturn.append ("1000"); break; case '9': sReturn.append ("1001"); break; case 'A': sReturn.append ("1010"); break; case 'B': sReturn.append ("1011"); break; case 'C': sReturn.append ("1100"); break; case 'D': sReturn.append ("1101"); break; case 'E': sReturn.append ("1110"); break; case 'F': sReturn.append ("1111"); break; } } return sReturn; }
十六進(jìn)制字符串轉(zhuǎn)二進(jìn)制字符串1的個(gè)數(shù)
優(yōu)化版
建立十六進(jìn)制字符串 字符“0-F” 對(duì)應(yīng)二進(jìn)制中1的個(gè)數(shù)的映射數(shù)組
代碼如下:
#include<iostream> #include<string> using namespace std; int main(){ string inputHex; cin >> inputHex; int bitOneNumber[16] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4}; inputHex = inputHex.substr(2); int cnt = 0; for(auto ch : inputHex){ if(ch >= '0' && ch <= '9') cnt += bitOneNumber[ch - '0']; else if(ch >= 'a' && ch <= 'f') cnt += bitOneNumber[ch - 'a' + 10]; else return -1; } cout << cnt << endl; system("pause"); return 0; }
十六進(jìn)制字符串轉(zhuǎn)為二進(jìn)制字符串
遍歷統(tǒng)計(jì)1的個(gè)數(shù)
#include<iostream> #include<string> using namespace std; string HexStrToBinStr(string& inputHex){ string binStr; for(auto ch : inputHex){ switch (ch) { case '0' : binStr += "0000"; break; case '1' : binStr += "0001"; break; case '2' : binStr += "0010"; break; case '3' : binStr += "0011"; break; case '4' : binStr += "0100"; break; case '5' : binStr += "0101"; break; case '6' : binStr += "0110"; break; case '7' : binStr += "0111"; break; case '8' : binStr += "1000"; break; case '9' : binStr += "1001"; break; case 'a' : binStr += "1010"; break; case 'b' : binStr += "1011"; break; case 'c' : binStr += "1100"; break; case 'd' : binStr += "1101"; break; case 'e' : binStr += "1110"; break; case 'f' : binStr += "1111"; break; default: break; } } return binStr; } int main(){ string inputHex; cin >> inputHex; inputHex = inputHex.substr(2); string binStr = HexStrToBinStr(inputHex); int cnt = 0; for(auto ch : binStr) if(ch == '1') ++cnt; cout << cnt << endl; cout << binStr << endl; system("pause"); return 0; }
二進(jìn)制字符串轉(zhuǎn)十進(jìn)制字符串
#include<iostream> #include<string> using namespace std; //十六進(jìn)制字符串串轉(zhuǎn)二進(jìn)制 string HexStrToBinStr(string& inputHex){ string binStr; for(auto ch : inputHex){ switch (ch) { case '0' : binStr += "0000"; break; case '1' : binStr += "0001"; break; case '2' : binStr += "0010"; break; case '3' : binStr += "0011"; break; case '4' : binStr += "0100"; break; case '5' : binStr += "0101"; break; case '6' : binStr += "0110"; break; case '7' : binStr += "0111"; break; case '8' : binStr += "1000"; break; case '9' : binStr += "1001"; break; case 'a' : binStr += "1010"; break; case 'b' : binStr += "1011"; break; case 'c' : binStr += "1100"; break; case 'd' : binStr += "1101"; break; case 'e' : binStr += "1110"; break; case 'f' : binStr += "1111"; break; default: break; } } return binStr; } //二進(jìn)制轉(zhuǎn)十進(jìn)制 struct decStr{ int len; char decstr[100000]; decStr() : len(0){ for(int i = 0; i < 100000; ++i) decstr[i] = 0; } }; void addCurNumToDecStr(decStr& data, int num){ for(int i = 0; i < data.len; ++i) data.decstr[i] *= 2; data.decstr[0] += num; for(int i = 0; i < data.len; ++i){ data.decstr[i + 1] += data.decstr[i] / 10; data.decstr[i] %= 10; } if(data.decstr[data.len] != 0) ++data.len; } string assicTostr(decStr&data){ string decstr; for(int i = data.len - 1; i >= 0; --i){ decstr += data.decstr[i] + '0'; } return decstr; } string BinStrToDecStr(string& binStr){ decStr data; for(int i = 0; i < binStr.size(); ++i){ addCurNumToDecStr(data, binStr[i] == '1' ? 1 : 0); } string decstr = assicTostr(data); return decstr; } int main(){ string inputHex; cin >> inputHex; inputHex = inputHex.substr(2); string binStr = HexStrToBinStr(inputHex); int cnt = 0; for(auto ch : binStr) if(ch == '1') ++cnt; cout << cnt << endl; cout << binStr << endl; string decstr = BinStrToDecStr(binStr); cout << decstr << endl; system("pause"); return 0; }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
c++優(yōu)先隊(duì)列用法知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理的是關(guān)于c++優(yōu)先隊(duì)列用法知識(shí)點(diǎn)總結(jié)內(nèi)容,需要的朋友可以參考學(xué)習(xí)下。2020-02-02C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07C++基礎(chǔ)學(xué)習(xí)之函數(shù)重載的簡(jiǎn)單介紹
函數(shù)重載是一種特殊情況,C++允許在同一作用域中聲明幾個(gè)類似的同名函數(shù),這些同名函數(shù)的形參列表(參數(shù)個(gè)數(shù),類型,順序)必須不同,常用來(lái)處理實(shí)現(xiàn)功能類似數(shù)據(jù)類型不同的問(wèn)題。這篇文章主要給大家介紹了關(guān)于C++基礎(chǔ)學(xué)習(xí)之函數(shù)重載的相關(guān)資料,需要的朋友可以參考下2019-01-01Ubuntu 20.04 下安裝配置 VScode 的 C/C++ 開(kāi)發(fā)環(huán)境(圖文教程)
這篇文章主要介紹了Ubuntu 20.04 下安裝配置 VScode 的 C/C++ 開(kāi)發(fā)環(huán)境,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05C語(yǔ)言初階之?dāng)?shù)組詳細(xì)介紹
大家好,本篇文章主要講的是C語(yǔ)言初階之?dāng)?shù)組詳細(xì)介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)創(chuàng)建及遍歷十字鏈表
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)十字鏈表的創(chuàng)建及遍歷,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-10-10