将数字从Base B1转换为Base B2,而不使用任何中间基数

有没有办法在不使用任何中间基础的情况下将数字从Base B1转换为Base B2。

例如:

214从基数5到基数16,不先将其转换为十进制,然后将十进制转换为hex。

谢谢

Alok Kr。

要将214 base5转换为基数16而不使用中间基数,您“只需”知道如何直接在基数5中进行计算。

首先,你需要一个基数为16的数字在基数为5的表格(你需要一个类似的表格,将基数10转换为基数为16时,只需要更容易保留在你的脑中!)。 这个表很容易创建 – 只需从0开始并递增每个基数为5行,直到达到基数为16的f

 base 16 | base 5 --------+-------- 0 | 0 1 | 1 2 | 2 3 | 3 4 | 4 5 | 10 6 | 11 7 | 12 8 | 13 9 | 14 a | 20 b | 21 c | 22 d | 23 e | 24 f | 30 

现在你只需要重复除以16(即31 base5 )。 我们现在回想起我们的小学时代,并使用长分(如果这看起来很难,那是因为没有人让你在5号基础上学习你的时间表!):

步骤1:

  ______ 31 ) 214 

第2步:

  3 ______ 31 ) 214 - 143 

第3步:

  3 _____ 31 ) 214 - 143 ---- 21 

因此214 base5除以31 base5的结果是3 base5余数21 base5

这意味着base16中的最低有效位是21 base5 ,您可以在表中找到b base16 。 除法的结果是3 base5 – 如果这大于30 base5那么我们将再次划分 – 但它不是,所以这意味着最重要的数字是(再次使用表格)3 base16

所以答案是214 base5 = 3b base16

这只是我们使用十进制系统的一个假象。 因此,您希望(在您的脑海中)想到每个十进制数的“值”。 因此,您将所有内容转换回基数10.如果您知道如何在其他基础上进行除法和乘法,那么在不使用基数10作为中间数的情况下来回转换将很容易。 然而,大多数人通常不进行5分/乘法,并将所有内容转换回基数10。

算法是相同的。 除以新基数的最大功率,然后将剩余部分除以较小的功率,你将得到新的基数。

例如0x3B到基数为5。

(数学基数为16)

3B / 5 ^ 2 = 2余数9

9/5 = 1余数4

所以0x3B = 214 base 5

如果你知道如何做非基数10师,那很简单。 但是,绝对没有理由去了解它,因此作为中间步骤转换回基数10要容易得多。

但是,有一种简单的方法可以在二进制和hex之间进行转换。 只需将数字拆分为4个二进制/ 1个hex数字的组,然后逐位转换。

 1111 0000 1100 0001 F 0 9 1 

不明白你的意思。 这些语言中的数字不在基数10(如果有的话,它们是基数2) – 当您将数字格式化为字符串时,用基数格式化它。

因此,如果您有一个数字的字符串表示forms,并将其转换为数字,然后格式化为不同的基础 – 您没有转换为基数10 – 您将字符串转换为int到字符串。

所以,如果问题是如何获取表示基本B1中的数字的字符串并将其转换为基本B2中的字符串而不将其转换为int,那么我没有看到一种方法可以轻松地做到这一点。

在您的示例中,基数5中的214是2*5^2 + 1 * 5 + 4 – 但如果您不想转换为int,那么您不知道。 这个数字在基数10中是59,但计算机将其视为00111011.您可以轻松地将其格式化为hex。 最终,你需要进行除法和乘法运算,并将中间结果存储在某处。

我不相信有任何“语法技巧”可以让你做一般的基本转换。 (例如,允许您从字符串“214”转到字符串“3B”而不确定哪个整数“214”(基数5)实际对应的技巧。)

我的意思是你必须知道你将使用的数字的价值 ,也就是说,你需要“解析”输入。

例如,基数5中的214将被解析为2 * 5 2 + 1 * 5 + 4.通过执行此类计算,您将无法以十进制forms获得它。 你会得到它的forms你的计算机决定存储结果整数(可能是二进制:)

从那时起你可以很容易地输出数字,例如16号。(注意你没有通过基数10.)正如@Lou Franco所说,你只是从字符串 – > int->字符串 ,而不是string-> string

是的,不是。 如果您不包括计算机以二进制(基数2)作为另一种表示forms执行所有操作的事实,请单击是。 毕竟,以下代码中的value基础是什么?

 long value = strtol(string, NULL, base); 

在某些意义上, value只是一个整数,并且没有关联的基数。 将它与一个函数结合起来,可以在一个特定的基础中从一个值转换为一个字符串表示,你可以很容易地从一个基础中的字符串表示到另一个基础中的字符串表示。 由于没有中间字符串表示,因此在某种意义上,没有中间基本值。

也许你可以创建一个代表每个基础的类。 该类将有一系列字段来表示每个数字 – 例如, Decimal类将具有单位字段,数字字段,数百个字段等等。 然后编写mutators以从对象表示的值(以及字段之间的句柄)中添加或减去一个,以及一个允许您检查值是否为零的访问器。 在输入数字的基础上创建一个对象(可能写一个解析字符串的方法?)和一个值为零的所需基数中的对象。 然后有一个循环,从输入数字中减去一个,并在输出数字中加1,直到输入数字达到零。

如果你通过解析字符串来创建对象,你可以避免问题aioobe指出你将数字表示为二进制,尽管你可以说是使用一元表示。 稍加思考你也可以使基类足够通用,以处理任意数量的基数。

将它们存储为int ,然后在需要像std::ios_base那样表示时进行转换。