我试图在不同的基础上表示最大64位无符号值。
对于基数2(二进制),它将是64 1:
1111111111111111111111111111111111111111111111111111111111111111
对于16(十六进制),它将是16 F
FFFFFFFFFFFFFFFF
对于基数10(十进制),它将是:
18446744073709551615
我试图在基数36中获得该值的表示(它使用0-9和A-Z)。有许多在线基础转换器,但它们都无法产生正确的表示,因为它们受到64位数学的限制。
有谁知道如何使用DC(这是一个非常难以使用的字符串数学处理器,可以处理无限数量的数字)并知道如何进行此转换?或者任何人都可以告诉我如何使用计算器执行此转换,该计算器不会因整数翻转而失败?
答案 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
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)
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'[digit]
很好。在生成数字时将数字附加到结果。