【问题标题】:Exotic base conversion without an intermediate value?没有中间值的奇异碱基转换?
【发布时间】:2015-03-14 22:55:36
【问题描述】:

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

在编写一个基数转换函数时,尤其是从一个任意基数到另一个任意基数的函数时,可以通过首先将数字转换为十进制,然后将其重新转换为目标数字来轻松实现。如果你在基数 [1,10] 的范围内,你也可以很容易地绕过中间值步骤。

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

  • 基数 7 到基数 33
  • 基数 -3 到基数 13
  • 基数 -16 到基数 16

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

【问题讨论】:

  • 首先显示数字 42(十进制)在基数 0 和基数 -3 中的样子,您认为。这没有多大意义。
  • 转换为十进制?可能是计算机中的二进制文件,对吧?无论如何,当然,您可以从任意基数转换为您想要的任意基数。只是计算机以二进制形式工作,让您的生活更轻松。
  • 有可能,您需要定义任意基数和执行基数转换所需的相应基本运算(乘积、除法、模数)。
  • base -3 到底是什么?!

标签: c++ base-conversion


【解决方案1】:

将具有n 基数B 的值V 进行基数转换到基数B' 中的等效值V' 的通用算法如下:

d(0),d(1),...d(n-1)V 在基数B 中的数字。使用转换表,我们将这些数字转换为数字序列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       

【讨论】:

  • 感谢您的详细解释。创建与具有任意基数的数字一起使用的算术运算符似乎既 (A) 更多工作,并且 (B) 可能比仅使用中间值慢,所以我想我现在就坚持使用这种方法。
【解决方案2】:

关于为什么 base-10 是中间基数的简短说明。因为熟悉。

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

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

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

第一个尝试涉及对数(数学函数的接口是以 10 为底的。(hmmm))。 Largest_exponet_of_new_base = log(your base10 number) / log(the of base 你要转换的)

【讨论】:

  • 数学函数的接口是二进制的。您可以将它们指定为以 8、10 或 16 为基数的文字(或者,使用用户定义的文字),您可以选择任何基数。
  • @MartinBonner 在机器级别你是正确的。内部表示是二进制的。您所描述的以及我引用 base-10 的原因是在编译或标记化运行时解释器之前的高级函数调用。不管预编译的计算机语言是什么,在转换为机器代码之前,基本数学接口在编码时都是以 10 为基数的。其他基本编译指示如 base-16 (0x...) 是编译/解释器指令。我在过去 30 多年中使用的超过 15 种语言中看到了这一点,包括各种汇编方言。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
  • 2011-10-24
  • 2010-11-17
  • 2021-01-30
  • 2015-04-09
相关资源
最近更新 更多