Codekata将数字从十六进制转换为十进制整数表示

时间:2015-12-22 19:37:18

标签: c++

我正在编写一个小程序转换字符串的十六进制表示,这是一个提高我技能的kata。

这就是我的想法

std::vector<int> decimal( std::string const & s )
{

auto getint = [](char const k){
switch(k){
case 'f':
return 15;
case 'e':
return 14;
case 'd':
return 13;
case 'c':
return 12;
case 'b':
return 11;
case 'a':
return 10;
case '9':
return 9;
case '8':
return 8;
case '7':
return 7;
case '6':
return 6;
case '5':
return 5;
case '4':
return 4;
case '3':
return 3;
case '2':
return 2;
case '1':
return 1;
case '0':
return 0;
};

std::vector<int> result;

for( auto const & k : s )
{
result.push_back(getint(k));
}

return result;

}

我想知道是否有另外一种方法可以做到这一点。我已经考虑过将某些东西用作std :: map,但我不确定哪一个可能更快。如果还有其他方法,请添加它。

请记住,我这样做是为了提高我的技能和学习代码 - kata。

谢谢,TIA!

3 个答案:

答案 0 :(得分:1)

首先,您可以像这样简化逻辑:

auto getint = [](char const k){
    if(k >= 'a' && k <= 'f') return (k - 'a');
    else if(k >= 'A' && k <= 'F') return (k - 'A');
    else if(k >= '0' && k <= '9') return (k - '0');
    else return -1;
}

除此之外,可能存在一个标准库函数,它可以完全根据您的具体需求进行操作。

答案 1 :(得分:0)

您可以使用strtol or strtoll来完成从base16字符串转换为整数值的大部分繁重工作。

然后使用stringstream对象转换回常规字符串。

// parse hex string with strtol
long value = ::strtol(s.c_str(), nullptr, 16);  //not shown - checking for errors. Read the manual page for more info

// convert value back to base-10 string
std::stringstream st;
st << value;
std::string result = st.str();

return result;

答案 2 :(得分:0)

对于十进制数字,将字符转换为数字非常容易,因为C ++规范说所有数字在所有编码中必须是连续的,'0'最低,'9'最高。这意味着您只需减去'0'即可将字符转换为数字,例如k - '0'。虽然这些字母没有这样的要求,但最常见的编码(ASCII)也是如此,但如果你想要便携的话,不应该指望它。

您也可以使用例如std::transformstd::back_inserter,所以不需要自己的循环。也许像是

std::transform(std::begin(s), std::end(s), std::back_inserter(result), getint);

getint功能中,您可以使用,例如std::isxdigitstd::isdigit分别检查字符是否为有效的十六进制或十进制数字。您应该使用例如如果十六进制数字为大写,则为std::tolower