代码之家  ›  专栏  ›  技术社区  ›  Nick Fortescue

1X10^49十进制-二进制位是多少?如何将其转换为二进制?

  •  2
  • Nick Fortescue  · 技术社区  · 6 年前

    我遇到过一个网站,它在URL查询字符串中使用了一个50位十进制整数ID,这似乎有点过分。

    最小的50位十进制数是 1.0 x 10^49 ,否则称为:

    1000000000
    0000000000
    0000000000
    0000000000
    0000000000
    
    1. 二进制表示将包含多少位?
    2. 考虑到无符号32位整数或64位整数的范围限制,如何将如此大的十进制数转换为二进制数?

    我只是出于纯粹的程序员好奇心而问——这不是大学问题、工作问题或面试难题!

    8 回复  |  直到 12 年前
        1
  •  7
  •   Martin B    15 年前
    1. 49*log(10)/log(2)=162.774477,因此二进制表示将包含163位。

    2. 使用bigint类并应用 standard algorithm 用于从十进制转换为二进制。

        2
  •  8
  •   Falaina    15 年前

    最小的二进制表示(具有整数精度)可以通过获取数字的日志(以2为基数)来找到。在这种情况下,二进制位的最小数量为log(10^49)=162.77。我们需要一个整数,所以我们就叫它163位。

    如果我必须表示这个数字,而浮点表示中的精度不够,我只需要使用一些 BigInteger 图书馆。

        3
  •  4
  •   phihag    15 年前

    因为每一个十进制数字传递的信息与 lb 10 位,任何50位数字将适合 ceil(lb(10)*50) = 167 位。

    具体来说,从十进制转换为二进制并不难,即使是用手工。只需除以2,然后将模数(如果最后一个数字是奇数,则为1,如果是偶数,则为0)放在二进制结果的末尾。如果您在程序中需要如此高的数字,只需使用平台的大整数实现,例如 BigInteger 在Java和公正 int 在蟒蛇中。如果没有,请查找数字库。

    噢,二进制的10^49是163位长:

    110
    1101 0111 1001 1111 1000 0010 0011 0010
    1000 1110 1010 0011 1101 1010 0110 0001
    1110 0000 0110 0110 1110 1011 1011 0010
    1111 1000 1000 1010 0000 0000 0000 0000
    0000 0000 0000 0000 0000 0000 0000 0000
    
        4
  •  1
  •   Jeffrey04 George    15 年前

    可以使用合适的longinteger操作库来转换这些数字。如果不允许使用,阅读源代码可以提供有用的知识,了解如何有效地完成这些工作。

    关于比特数,您只需求解方程:

    n = 10 五十

    记日志 两个部分:

    n=log 五十

    现在转换日志 记录 :

    n=log 五十 =原木 五十 日志 2=50/log

    取n的下一个整数(CEIL)-这是所需的位数。

        5
  •  0
  •   Steve Gilham    15 年前

    1)2^10~10^3,所以10^48~2^160;10^49将是164位的数量。

    2)使用biginteger或mpi类(如果您的语言标准API库没有提供,则可以找到大量的biginteger或mpi类)。Knuth知道细节。

        6
  •  0
  •   Nefrubyr    15 年前

    我将使用一种高级语言来为我处理大整数。IRB(Ruby)会话示例:

    >> (10**49).to_s
    => "10000000000000000000000000000000000000000000000000"
    >> (10**49).to_s(2)
    => "1101101011110011111100000100011001010001110101000111101101001100001111000000110011011101011101100101111100010001010000000000000000000000000000000000000000000000000"
    >> (10**49).to_s(2).size
    => 163
    
        7
  •  0
  •   daveb    15 年前

    存储数字X的确切含义是什么?

    1. 你的意思是存储所有0到X之间的数字吗?
    2. 或者所有介于-x和x之间的数字?
    3. 或者只存储信息:空/X。

    我的直觉是面试官可能指的是第三个。答案是1位。

        8
  •  0
  •   Rick Regan    15 年前

    50位十进制整数的范围从10^49到10^50-1。10^49是163位,10^50-1是167位。如果你想要精确的位数,你需要直接取那些大数字的对数,而不是仅仅计算“捷径”50*对数。 (2)。

    作为一种选择,你可以 convert the number to binary using an arbitrary precision decimal-binary converter 并计算位(btw,我链接到的转换器为您计算位)。