我想编写一个程序将十六进制数转换为十进制形式,而不使用固定长度的变量来存储结果,因为这会限制我的程序可以使用的输入范围。
假设我要使用类型long long int
的变量来计算、存储和打印结果。这样做会将我的程序可以处理的十六进制数的范围限制在8000000000000001
到7FFFFFFFFFFFFFFF
之间。超出此范围的任何内容都会导致变量溢出。
我确实编写了一个程序,通过执行进位和借用操作来计算十进制结果并将其存储在动态分配的字符串中,但它的运行速度要慢得多,即使对于像7FFFFFFFF
一样大的数字也是如此!
然后我偶然发现了这个网站,它可以接受超出 64 位变量范围的数字。我尝试了他们的转换器,其数字比16^65 - 1
大得多,但仍然无法让它溢出。它只是继续打印结果。
我认为他们必须使用更好的算法进行十六进制到十进制的转换,该算法不限于 64 位值。
到目前为止,谷歌的搜索结果只引导我使用一些固定长度的变量来存储结果的算法。
这就是我在这里的原因。我想知道这样的算法是否存在,如果存在,它是什么?
嗯,听起来你在编写"一个通过执行进位和借用操作计算十进制结果并将其存储在动态分配的字符串中的程序"时已经做到了。
从基数 16(十六进制(转换为基数 10 意味着以 10x为基数表示实现数字的乘法和加法。 然后对于每个十六进制数字d,您计算result = result*16 + d
. 完成后,您在基于 10 的表示形式中具有相同的数字,该表示形式很容易写出十进制字符串。
基于字符串的方法运行缓慢的原因可能有很多。 如果你提供它,我相信有人可以发表评论。
但是,使其相当快的最重要技巧是选择正确的基础来转换。 我可能会以 109为基数进行乘法和加法,以便每个数字都尽可能大,同时仍然适合 32 位整数,并一次处理 7 个十六进制数字,这是我所能做到的,而只乘以个位数。
对于每 7 个十六进制数字,我会将它们转换为数字d,然后执行result = result * (16^7) + d
.
然后我可以得到以 10 9 为基数的每个结果数字的 9 个十进制数字。
这个过程非常简单,因为你只需要乘以个位数。 我相信有更快、更复杂的方法可以递归地将数字分解成大小相等的部分。