考点
十六进制的字符串怎么处理?
我们可以将其转化成二进制的字符串处理(c++ 里先转化成数字,在通过&1 取每一位,来得到每一位,构成字符串去操作), 或者转化成一个数字,再去位操作。位操作
让他匹配的关键是位操作&来取出需要的位,在通过异或^来判断字符串与模式是否匹配
#include <iostream>
#include <vector>
#include <numeric>
#include<limits>
#include <sstream>
using namespace std;
/** 请完成下面这个函数,实现题目要求的功能 **/
/** 当然,你也可以不按照这个模板来作答,完全按照自己的想法来 ^-^ **/
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;
}