【问题标题】:Fastest algorithm to convert hexadecimal numbers into decimal form without using a fixed length variable to store the result将十六进制数转换为十进制形式的最快算法,无需使用固定长度变量来存储结果
【发布时间】:2020-01-10 17:11:14
【问题描述】:

我想编写一个程序来将十六进制数转换为十进制形式,而不使用固定长度的变量来存储结果,因为这会限制我的程序可以使用的输入范围。

假设我要使用long long int 类型的变量来计算、存储和打印结果。这样做会将我的程序可以处理的十六进制数字范围限制在80000000000000017FFFFFFFFFFFFFFF 之间。超出此范围的任何内容都会导致变量溢出。

我确实编写了一个程序,该程序通过执行进位和借位操作来计算十进制结果并将其存储在动态分配的字符串中,但它运行得慢得多,即使对于像 7FFFFFFFF 这样大的数字也是如此!

然后我偶然发现了this site,它可能会采用超出 64 位变量范围的数字。我用比16^65 - 1 大得多的数字尝试了他们的转换器,但仍然无法让它溢出。它只是继续打印结果。

我认为他们必须使用更好的算法来进行十六进制到十进制的转换,这种算法不限于 64 位值。

到目前为止,Google 的搜索结果只引导我使用一些固定长度变量来存储结果的算法。

这就是我在这里的原因。我想知道这样的算法是否存在,如果存在,它是什么?

【问题讨论】:

  • 查看str_hex2dec,它在字符串上完全可以做到这一点

标签: algorithm hex decimal base-conversion


【解决方案1】:

好吧,听起来您在编写“通过执行进位和借位操作来计算十进制结果并将其存储在动态分配的字符串中的程序”时已经这样做了。

从基数 16(十六进制)转换为基数 10 意味着以 10x 表示形式实现数字的乘法和加法。然后对于每个十六进制数字 d,您计算 result = result*16 + d。完成后,您会以基于 10 的表示形式获得相同的数字,该数字很容易写成十进制字符串。

您的基于字符串的方法运行缓慢可能有多种原因。如果你提供它,我相信有人可以发表评论。

不过,让它相当快的最重要的技巧是选择正确的基础来转换。我可能会以 109 为底进行乘法和加法,这样每个数字都将尽可能大,同时仍适合 32 位整数,并且一次处理 7 个十六进制数字,这尽可能多,同时只乘以个位数。

对于每 7 个十六进制数字,我会将它们转换为一个数字 d,然后执行result = result * ‭(16^7) + d

然后我可以得到以 10 为底的每个结果数字的 9 个十进制数字9

这个过程非常简单,因为您只需乘以个位数。我确信有更快、更复杂的方法可以递归地将数字分成大小相等的部分。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 2017-12-28
  • 2011-03-03
  • 2015-01-26
  • 1970-01-01
  • 2016-08-21
相关资源
最近更新 更多