0

我试图以不同的基数表示最大的 64 位无符号值。

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

    1111111111111111111111111111111111111111111111111111111111111111

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

    FFFFFFFFFFFFFFFF

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

    18446744073709551615

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

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

4

3 回答 3

4

我用 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

Bignum 的文档中

Bignum 对象包含 Fixnum 范围之外的整数。当整数计算会溢出 Fixnum 时,会自动创建 Bignum 对象。当涉及 B​​ignum 对象的计算返回适合 Fixnum 的结果时,该结果将自动转换。

于 2012-05-11T18:31:42.787 回答
3

可以用 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
于 2015-10-15T14:33:40.083 回答
0
  1. 获取任何可以处理任意大整数的语言。Ruby、Python、Haskell,应有尽有。
  2. 实现基本步骤:模 36 为您提供下一个数字,除以 36 为您提供去掉最后一位数字的数字。
  3. 以您喜欢的方式将数字映射到字符。例如, '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'[digit]对我来说很好。在生成结果时将数字附加到结果中。
  4. ???
  5. 返回连接的数字字符串。利润!
于 2012-05-11T19:01:19.610 回答