我想编写一个程序来将十六进制数转换成十进制形式,而不使用固定长度的变量来存储结果,因为这将限制我的程序可以使用的输入范围。
假设我使用long long int类型的变量来计算、存储和打印结果这样做会将我的程序可以处理的十六进制数的范围限制在80000000000000017FFFFFFFFFFFFFFF之间。超出此范围的任何内容都会导致变量溢出。
我确实编写了一个程序,通过执行进位和借位操作来计算十进制结果并将其存储在动态分配的字符串中,但它运行得慢得多,即使对于小于cc>的数字也是如此!
然后我偶然发现了this site它可以接受远远超出64位变量范围的数字。我试过用比7FFFFFFFF大得多的数字来转换,但仍然无法使它溢出它只是继续打印结果。
我认为他们必须使用一个更好的十六进制到十进制转换算法,一个不限于64位值的算法。
到目前为止,Google的搜索结果只让我找到了一些使用固定长度变量来存储结果的算法。
这就是我来这里的原因我想知道这样的算法是否存在,如果有的话,它是什么?

最佳答案

当你写“一个通过执行进位和借位操作来计算并将十进制结果存储在动态分配的字符串中的程序”时,听起来你已经做到了。
从16进制(十六进制)转换为10进制意味着在10进制表示中实现数字的乘法和加法然后对于每个十六进制数字d,计算result = result*16 + d。完成后,在基于10的表示中有相同的数字,很容易作为十进制字符串写出。
基于字符串的方法速度慢的原因有很多如果你提供的话,我相信有人会评论的。
不过,最重要的诀窍是选择正确的基础进行转换我可能会在基数109中进行乘法和加法运算,这样每个数字在仍然适合32位整数的情况下尽可能大,并且一次处理7个十六进制数字,这是尽可能多的,同时只能乘以单个数字。
对于每7个十六进制数,我将它们转换成一个数字d,然后执行result = result * ‭(16^7) + d
然后我可以得到以109为基数的每个结果数字的9位小数。
这个过程非常简单,因为你只需要乘以一位数。我相信有更快,更复杂的方法递归地把数字分解成大小相等的部分。

关于algorithm - 将十六进制数字转换为十进制形式的最快算法,而无需使用固定长度的变量来存储结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57845464/

10-11 23:02
查看更多