考點
十六進制的字符串怎么處理?
我們可以將其轉(zhuǎn)化成二進制的字符串處理(c++ 里先轉(zhuǎn)化成數(shù)字埠褪,在通過&1 取每一位浓利,來得到每一位,構(gòu)成字符串去操作), 或者轉(zhuǎn)化成一個數(shù)字,再去位操作钞速。位操作
讓他匹配的關(guān)鍵是位操作&來取出需要的位贷掖,在通過異或^來判斷字符串與模式是否匹配
#include <iostream>
#include <vector>
#include <numeric>
#include<limits>
#include <sstream>
using namespace std;
/** 請完成下面這個函數(shù),實現(xiàn)題目要求的功能 **/
/** 當然渴语,你也可以不按照這個模板來作答苹威,完全按照自己的想法來 ^-^ **/
void deletePrefixZeros(string& str) {
while (str.size() > 1 && str[0] == '0') {
str.erase(0, 1);
}
}
// check whether string has illegal char
bool isValid(string& str) {
int length = (int)str.size();
for(int i = 0; i < length; i++) {
if( !((str[i] >= '0' && str[i] <= '9') || (str[i] >= 'A' && str[i] <= 'F'))) {
return false;
}
}
return true;
}
// empty string "" means input string illegal
string Decode(string in) {
bool isLegal = isValid(in);
if(!isLegal)
return "";
deletePrefixZeros(in);
if (in.length() > 8) {
return "";
}
int num = 0;
stringstream ss;
ss << hex << in;
ss >> hex >> num;
if( ((num & 0x80) ^ 0) == 0) {
if(num >= 0 && num <= 127)
{
ss << num;
string result;
ss >> result;
return result;
}
else{
return "";
}
}
else if( ((num & 0xE0C0) ^ 0xC080) == 0) {
int trueNum = 0;
num = num & 0x1F3F;
trueNum += (num & 0xFF);
num = num & 0xFF00;
num = num >> 2;
trueNum += num;
stringstream sss;
sss << trueNum;
string result;
sss >> result;
return result;
}
else if( ((num & 0xF0C0C0) ^ 0xE08080) == 0) {
// to do
}
else if( ((num & 0xF8C0C0C0) ^ 0xF0808080) == 0) {
// to do
}
else
return "";
printf("haha");
return "";
}
int main() {
string res;
string _in("C280");
res = Decode(_in);
cout << res << endl;
return 0;
}