【问题标题】:How to convert hexadecimal to decimal recursively [closed]如何递归地将十六进制转换为十进制[关闭]
【发布时间】:2019-11-07 20:38:40
【问题描述】:

我需要进行此转换,但不知道。有人能帮我吗?我需要这个来完成一个基本转换的计算器。我还需要该函数返回一个整数来转换以在我的其他函数中使用。

PS:对不起,我的英语不好。

我希望 11F 是整数 287。

【问题讨论】:

标签: c++ hex base converters


【解决方案1】:

这里有一些递归:

int hexToBase10(const std::string& number, size_t pos = 0) {
   if (pos == number.length())
       return 0;
   char digit = number[number.size() - pos - 1];
   int add = digit >= '0' && digit <= '9' ? digit - '0'
                                          : digit - 'A' + 10;
   return 16 * hexToBase10(number, pos + 1) + add;
}

这样称呼:

hexToBase10("11F");  // 287

顺便说一句,使用std::hex 似乎更安全。

【讨论】:

  • 您应该注意:十六进制字符串不能包含前缀"0x""0X",并且十六进制字符必须是大写的(您可以解决后者通过包含&lt;cctype&gt; 并在您的函数中使用std::tolower())。您可以在调用者中或在使用.find() 来检查'x''X' 的函数的包装器中寻址前者,并超越前缀。 (例如尝试转换"11f""0x11F")也就是说,您确实回答了问题的“递归”方面。
【解决方案2】:

如果它最多适合 unsigned long long,您可以使用 stdlib.h 中的 strtoul/strtoull 将其从 base-16 字符串解析为整数。

然后您可以简单地打印以 10 为底的整数。

#include <stdlib.h>
#include <stdio.h>
int main()
{
    char const *hex = "11F";
    char *endptr;
    unsigned long ul = strtoul(hex,&endptr,16);
    printf("%lu\n", ul);
}

【讨论】:

  • 这里唯一的问题是缺少递归,这是我无法想象的要求。
  • 可能是让学生熟悉这个概念的课堂作业。
猜你喜欢
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 2015-09-13
  • 2013-10-08
  • 2014-09-04
  • 2021-01-29
  • 2011-07-28
  • 1970-01-01
相关资源
最近更新 更多