Math 将基数36直接转换为基数16?

Math 将基数36直接转换为基数16?,math,Math,描述一个将base36数字转换为base16的过程,而不将base10转换为中间值。假设您有一个将单个base-36数字转换为base-16的函数f,您可以递归地定义转换函数c,如下所示:对于带数字的base-36数字a\n。。。a_1带n>1返回f(a_1)+24_16*c(a_n…a_2)(如36在base-16中表示为“24”);对于只有一个数字的基36数字a_1,只需返回f(a_1)。这显然是假设您能够在base-16中进行算术运算 当然,这里真正的问题是在base-16中进行算术运算—

描述一个将base36数字转换为base16的过程,而不将base10转换为中间值。

假设您有一个将单个base-36数字转换为base-16的函数
f
,您可以递归地定义转换函数
c
,如下所示:对于带数字的base-36数字
a\n。。。a_1
n>1
返回
f(a_1)+24_16*c(a_n…a_2)
(如36在base-16中表示为“24”);对于只有一个数字的基36数字
a_1
,只需返回
f(a_1)
。这显然是假设您能够在base-16中进行算术运算

当然,这里真正的问题是在base-16中进行算术运算——这就是为什么通常通过一些中间基进行基转换,您可以在其中进行算术运算;i、 e.纸上的base-10和计算机中的base-2


请注意,从base-2转换为base-16是一个非常简单的操作。因为16是2的幂,所以您不需要执行任何算术运算:您可以逐位(或者更确切地说,4位乘4位)执行转换。

是的,您可以直接执行此操作,但您需要在基数16中执行算术运算。诀窍是预先计算基数为16的36、36^2、36^3等的值。例如,将基数36中表示为237的数字转换为基数16中的数字

一种简单的方法是将其转换为十进制,或任何可以进行算术运算的中间系统。因此,我可以按你的意愿去做

2*36^2+3*36+7=2707(十进制)

然后从十进制转换为十六进制,得到

10*16^2+9*16+3=A93(十六进制)

直接的解决办法很简单。我这样做是为了让你相信这是没有必要的。只需(提前)计算十六进制中36^2的值。因此,

36^2=510(十六进制)

36=24(十六进制)

存储这些预计算的值。现在用十六进制进行所有计算

237(基36)=2*510+3*24+7(十六进制)


用十六进制算法进行最后的扩展,你应该得到一个十六进制的93。您已经完全按照需要使用十六进制完成了计算,而没有使用中间基。即使是36次幂的预计算也可以用十六进制来完成。

我可以向你保证不是这样。我已经将sha256哈希(十六进制的256位摘要)转换为base36值,以存储在db中。但我需要一种方法将其转换回base16进行比较。我知道如何使用十进制中间值,但它不是很优雅,我想要更干净的。如果你能去掉负数,我将不胜感激。我认为这不值得。你说的“十进制中介”是什么意思?你确定你用的不是基数2作为中介吗?因为这是最有可能的情况,也是最简单的。从36垒转换到10垒,然后再从10垒转换到16垒。但各基地之间确实没有区别,;转换总是一样的。我想我不理解这一点,因为我看不出这是如何工作的。你不理解这一点吗?我也感到困惑。629以36为底为“hh”(标准数字+字母映射),以16为底为“275”然而,h'=17在基数16中是'11'。这里没有递归的数字累加方法可以工作。在我看来,你的意思只是“整数”,而不是“base-16[数字集合]”。我的方法不是在base-16中进行“数字累加”,而是要求你在base_16中进行算术运算。例如,在您的示例中:
c(hh)=f(h)+24_16*c(h)=11_16+24_16*11_16=275_16=629
。当然,这里真正的问题是在base-16中进行算术运算——这就是为什么通常通过一些中间基进行基转换,您可以在其中进行算术运算;i、 在纸上打10,在电脑上打2。好的,我想我现在看到了。除非我可以在10以外的基数上执行算术,否则我必须先转换为10基数。看来没办法了。