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)換為大寫(xiě)!(%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ǔ)言進(jìn)階幾分鐘帶你理解大小端存儲(chǔ)模式
這篇文章主要為大家介紹了C語(yǔ)言進(jìn)階大小端模式的示例詳解,帶各位讀者朋友五分鐘腳踩大小端模式,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-02-02
C語(yǔ)言中strcpy()函數(shù)的具體實(shí)現(xiàn)及注意事項(xiàng)
C語(yǔ)言庫(kù)函數(shù)char *strcpy(char *dest, const char *src)把src所指向的字符串復(fù)制到dest,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中strcpy()函數(shù)的具體實(shí)現(xiàn)及注意事項(xiàng)的相關(guān)資料,需要的朋友可以參考下2022-11-11
C++中對(duì)象的賦值與復(fù)制操作詳細(xì)解析
對(duì)象之間的賦值也是通過(guò)賦值運(yùn)算符“=”進(jìn)行的。本來(lái)賦值運(yùn)算符“=”只能用來(lái)對(duì)單個(gè)的變量賦值,現(xiàn)在被擴(kuò)展為兩個(gè)同類對(duì)象之間的賦值,這是通過(guò)對(duì)賦值運(yùn)算符的重載實(shí)現(xiàn)的2013-10-10
一個(gè)string類的簡(jiǎn)單實(shí)現(xiàn)案例
下面小編就為大家?guī)?lái)一篇一個(gè)string類的簡(jiǎn)單實(shí)現(xiàn)案例。小編覺(jué)得挺不錯(cuò)的現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
OpenCV使用BSM統(tǒng)計(jì)視頻中移動(dòng)的對(duì)象
這篇文章主要為大家詳細(xì)介紹了OpenCV如何使用BackgroundSubstractor(BSM)實(shí)現(xiàn)視頻中移動(dòng)對(duì)象統(tǒng)計(jì)功能,文中的示例代碼講解詳細(xì),需要的可以參考一下2023-02-02
C語(yǔ)言中settimeofday函數(shù)和gettimeofday函數(shù)的使用
這篇文章主要介紹了C語(yǔ)言中的settimeofday函數(shù)和gettimeofday函數(shù)的使用,注意settimeofday()函數(shù)只返回0和-1,需要的朋友可以參考下2015-08-08
C語(yǔ)言實(shí)現(xiàn)小學(xué)生隨機(jī)出題測(cè)試計(jì)分
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)小學(xué)生隨機(jī)出題測(cè)試計(jì)分,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03
C語(yǔ)言實(shí)現(xiàn)電子郵件地址驗(yàn)證程序
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)電子郵件地址驗(yàn)證程序,利用的是POSIX正則表達(dá)式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-11-11

