如何使用DC或其他将大数字转换为基数36

时间:2012-05-11 18:09:47

标签: numbers 64-bit dc

我试图在不同的基础上表示最大64位无符号值。

对于基数2(二进制),它将是64 1:

    1111111111111111111111111111111111111111111111111111111111111111

对于16(十六进制),它将是16 F

    FFFFFFFFFFFFFFFF

对于基数10(十进制),它将是:

    18446744073709551615

我试图在基数36中获得该值的表示(它使用0-9和A-Z)。有许多在线基础转换器,但它们都无法产生正确的表示,因为它们受到64位数学的限制。

有谁知道如何使用DC(这是一个非常难以使用的字符串数学处理器,可以处理无限数量的数字)并知道如何进行此转换?或者任何人都可以告诉我如何使用计算器执行此转换,该计算器不会因整数翻转而失败?

3 个答案:

答案 0 :(得分:3)

我用ruby快速测试了一下:

i = 'FFFFFFFFFFFFFFFF'.to_i(16)
puts i               #18446744073709551615
puts i.to_s(36)      #3w5e11264sgsf

您也可以使用更大的数字:

i = 'FFFFFFFFFFFFFFFF'.to_i(16) ** 16
puts i                  
puts i.to_s(36)      

结果:

179769313486231590617005494896502488139538923424507473845653439431848569886227202866765261632299351819569917639009010788373365912036255753178371299382143631760131695224907130882552454362167933328609537509415576609030163673758148226168953269623548572115351901405836315903312675793605327103910016259918212890625
1a1e4vngailcqaj6ud31s2kk9s94o3tyofvllrg4rx6mxa0pt2sc06ngjzleciz7lzgdt55aedc9x92w0w2gclhijdmj7le6osfi1w9gvybbfq04b6fm705brjo535po1axacun6f7013c4944wa7j0yyg93uzeknjphiegfat0ojki1g5pt5se1ylx93knpzbedn29

简短解释大数字会发生什么:

正常数字为Fixnums。如果您获得更大的数字,则该数字变为Bignum

small = 'FFFFFFF'.to_i(16)
big = 'FFFFFFFFFFFFFFFF'.to_i(16) ** 16

puts "%i is a %s" % [ small, small.class ]
puts "%i\n is a %s" % [ big, big.class ]
puts "%i^2 is a %s" % [ small, (small ** 2).class ]

结果:

268435455 is a Fixnum
179769313486231590617005494896502488139538923424507473845653439431848569886227202866765261632299351819569917639009010788373365912036255753178371299382143631760131695224907130882552454362167933328609537509415576609030163673758148226168953269623548572115351901405836315903312675793605327103910016259918212890625
 is a Bignum
268435455^2 is a Bignum

来自documentation of Bignum

  

Bignum对象保持Fixnum范围之外的整数。当整数计算否则会溢出Fixnum时,会自动创建Bignum对象。当涉及Bignum对象的计算返回适合Fixnum的结果时,结果将自动转换。

答案 1 :(得分:2)

可以使用dc完成,但输出不是非常有用。

$ dc
36
o
16
i
FFFFFFFFFFFFFFFF
p
 03 32 05 14 01 01 02 06 04 28 16 28 15

以下是解释:

单独输入一个数字会推送该号码

o弹出堆栈并设置输出基数。

i弹出堆栈并设置输入基数。

p以当前输出基数打印堆栈顶部的数字。但是,dc打印任何输出的基数大于16的二进制(不是ASCII)。

在dc中,命令可以全部放在同一行,如下所示:

$ dc
36o16iFFFFFFFFFFFFFFFFp
 03 32 05 14 01 01 02 06 04 28 16 28 15

答案 2 :(得分:1)

  1. 获取任何可以处理任意大整数的语言。 Ruby,Python,Haskell,你的名字。
  2. 实施基本步骤:模36为您提供下一个数字,除以36为您提供最后一位数字的数字。
  3. 以您喜欢的方式将数字映射到字符。例如,我'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'[digit]很好。在生成数字时将数字附加到结果。
  4. ???
  5. 返回连接的数字字符串。利润!