这只是我们使用十进制系统的一个假象.因此,您希望(在您的脑海中)想到十进制中每个数字的"值".因此,您将所有内容转换回基数10.如果您知道如何在其他基础上进行除法和乘法,那么在不使用基数10作为中间数的情况下来回转换将很容易.然而,大多数人通常不进行5分/乘法,并将所有内容转换回基数10.
算法是相同的.除以新基数的最大功率,然后将剩余部分除以较小的功率,你将得到新的基数.
例如0x3B到基数为5.
(数学基数为16)
3B/5 ^ 2 = 2余数9
9/5 = 1余数4
所以0x3B = 214 base 5
如果你知道如何做非基础10师,那很简单.但是,绝对没有理由去了解它,因此作为中间步骤转换回基数10要容易得多.
但是,有一种简单的方法可以在二进制和十六进制之间进行转换.只需将数字拆分为4个二进制/ 1个十六进制数字的组,然后逐位转换.
1111 0000 1100 0001
F 0 9 1
Run Code Online (Sandbox Code Playgroud)
不明白你的意思.这些语言中的数字不在基数10(如果有的话,它们是基数2) - 当您将数字格式化为字符串时,您可以使用基数格式化它.
因此,如果您有一个数字的字符串表示,并将其转换为数字,然后格式化为不同的基础 - 您不转换为基数10 - 您将字符串转换为int到字符串.
所以,如果问题是如何获取表示基本B1中的数字的字符串并将其转换为基本B2中的字符串而不将其转换为int,那么我没有看到一种方法可以轻松地做到这一点.
在您的示例中,基数5中的214是2*5^2 + 1 * 5 + 4- 但如果您不想转换为int,那么您不知道.这个数字在基数10中是59,但计算机将其视为00111011.您可以轻松地将其格式化为十六进制.最终,无论如何,您需要进行除法和乘法,并将中间结果存储在某处.
要将214 base5转换为基数16而不使用中间基数,您"只需"知道如何直接在基数5中进行计算.
首先,您需要一个基数为16的基数为16的表(在将基数10转换为基数16时需要一个类似的表,这只是一个更易于保留在您脑中!).这个表很容易创建 - 只需从0开始并递增每个基数5行,直到你到达f16.
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
Run Code Online (Sandbox Code Playgroud)
现在你只需要重复除以16(即31 base5).我们现在回想起我们的小学时代,并使用长分(如果这看起来很难,那是因为没有人让你在5号基础上学习你的时间表!):
步骤1:
______
31 ) 214
Run Code Online (Sandbox Code Playgroud)
第2步:
3
______
31 ) 214 -
143
Run Code Online (Sandbox Code Playgroud)
第3步:
3
_____
31 ) 214 -
143
----
21
Run Code Online (Sandbox Code Playgroud)
因此214 base5除以31 base5的结果是3 base5余数21 base5.
这意味着base16中的最低有效位是21 base5,您可以在表中找到b base16.除法的结果是3 base5 - 如果这大于30 base5那么我们将再次划分 - 但它不是,所以这意味着最重要的数字是(再次使用表格)3 base16.
所以答案是214 base5 = 3b base16.