没有中间值的奇异基础转换?

Exotic base conversion without an intermediate value?

我刚刚实现了一个任意基数转换器,我有一刻好奇:是否有一种通用的基数转换方法适用于任何可能范围的基数输入(不包括基数 0),并且不使用中间值更方便的基地价值?

在编写基数转换函数时,特别是从任意基数到另一个任意基数的函数,可以很容易地实现,首先将数字转换为十进制,然后再将其重新转换为目标数字。如果您在基数 [1,10].

的范围内,您也可以很容易地通过算术绕过中间值步骤

但是,当您扩大范围时,它似乎变得更加棘手。考虑以下示例(素数似乎可能会稍微缩小可能的方法?):

我在这里或 Google 的其他地方没有看到太多关于这个问题的讨论;大多数要么具有较窄的碱基范围,要么使用中间值。有什么想法吗?

通用算法,用于将基数 B 中具有 n 位的值 V 转换为基数 [=18= 中的等效值 V' ]如下:

d(0),d(1),...d(n-1)为基数BV的数字。使用翻译 table,我们将这些数字转换为数字序列 d'(0),d'(1),...,d'(n),其中每个 d'(i) 都是原始 d(i) 数字,但以新基数 B' 表示]

那么,V' 定义为:

V' = d'(0)*B^0 + d'(1)*B^1 + d'(2)*B^2+.....+d'(n-1)*B^(n-1)

问题来了(这也是您需要中间值的原因):不仅上述公式的所有值都必须以基数 B' 表示,而且所有运算(加法和乘法)都有将使用基数 B'

中的算术执行

例如:如何将以 3 表示的数字 V = 201 转换为 2,而不先将其转换为 10。

V的数字以3为底表示为d(0)=1, d(1)=0, d(2)=2 转换为基数 2,d'(0)=1, d'(1)=0, d'(2)=10 原基数为3,但一般转换公式需要用目标基数(2)表示,所以取值B=11 那么:

V' = d'(0)*B^0 + d'(1)*B^1 + d'(2)*B^2+.....+d'(n-1)*B^(n-1)

取值并以 2 为基数运算

V' = 1 + 0 + 10*(11^2) = 1 + 10*11*11 = 1 + 10010 = 10011

所以,201(3 = 10011(2

证明:

201(3 = 2*3^2 + 0 + 1 = 19
10011 = 1 + 2 + 16 = 19       

简要说明为什么以 10 为基数是中间基数。因为熟悉。

从幼儿园到现在,无论我们是否知道,学校都教我们以 10 为底。我们的语言以 10 为中心,无论是表达的、书面的还是编译的。设计的计算机语言将 base-10 用于其高级人类用户界面,并使用 运行-time 函数的通用参数,而不管内部表示如何。

因为以 10 为基数存在于我们的日常生活中,所以我们无需过多考虑以 10 为基数的工件序列(0 到 9),让我们的头脑为手头的任务计划其他逻辑.当我在 1982 年设计这个 alogrythm 时,为了简单起见,我选择了 0-9A-Z 工件列表方法作为一种指数映射,这样可以更容易地利用语言数学运算和字符串接口,它们都以 base- 为中心10. (嗯,又是 10 进制的东西。)

因此,如果您真的想让您的头受伤,通过使整个过程过于复杂来重新设计一个全新的用户界面,那就去做吧。您仍然会发现自己使用以 10 为基数的参数。 (嗯)

第一项工作涉及对数(数学函数的接口是以 10 为底。(嗯))。 Largest_exponet_of_new_base = log(你的 base10 数字) / log(你要转换的基数)