首页 文章

将十进制数字转换为二进制表示形式的非常大的数字? [关闭]

提问于
浏览
3

我有一个非常大的数字,大约一千位十进制数字,我必须将其转换为二进制表示 . 数字存储为字符串 .

由于很少有语言具有基本数据类型来处理这么大的数字,我认为没有简单的方法可以将其转换为可以转换它的整数值 .

有人可以帮帮我吗?这样做的可行方法是什么?

1 回答

  • 32

    如果这是一个真正的问题,那里有很多BigNum库可以提供帮助,例如MPIR库 .

    如果你不能使用第三方库,它实际上需要一个复杂的BigNum库,你只需要一个操作:除以2 .

    这是你如何做到的 . 从一堆空二进制数字开始 . 然后循环直到数字为“0”(是的,那仍然是一个字符串) . 如果数字的最后一位是奇数,则将1按到堆栈,否则按0.然后将数字除以2并重新启动循环 .

    循环结束后(数字为“0”),一次一个地从堆栈中弹出数字并打印出来 . 你去吧


    哦,是的,除以二,这是一个相当重要的难题:-)

    让我们从“12345”开始吧 . 这是您在伪代码中遵循的过程 .

    Set next_additive to 0.
    For every digit in number (starting at the left):
        Set additive to next_additive.
        If the digit is odd, set next_additive to 5, else set it to 0.
        Divide the digit by two (truncating) then add additive.
    Remove leading zero if necessary (if it starts with 0 but is not just 0).
    

    这可以通过一次处理实际字符串一个字符来完成 .

    • 1 (从 12345 开始),加法为 0 ,数字为奇数,因此next_additive为 5 . 将 1 除以 2 并添加 0 的加法,得到 002345 .

    • 下一个数字 2 ,添加剂为 5 ,数字为偶数,因此next_additive为 0 . 将 2 除以 2 并添加 5 的加法,得到 606345 .

    • 下一个数字 3 ,加法为 0 ,数字为奇数,因此next_additive为 5 . 将 3 除以 2 并添加 0 的加法,得到 106145 .

    • 下一个数字 4 ,添加剂为 5 ,数字为偶数,因此next_additive为 0 . 将 4 除以 2 并添加 5 的加法,得到 706175 .

    • 下一个数字 5 ,加法为 0 ,数字为奇数,因此next_additive为 5 . 将 5 除以 2 并添加 0 的加法,得到 206172 .

    • 剥离前导零: 6172 . 由于您截断了结果,因此忽略下一个添加剂 .

    你有它: 12345 / 2 = 6172 .


    举例来说,这里's a Python approach to implementing this algorithm as follows. First the support routine for checking if a string-number is odd (keep in mind this isn' t意味着是Pythonic代码,它几乎肯定是用Python做的更好的方法,但不一定能很好地映射到另一种语言):

    def oddsToOne(s):
        if s.endswith('1'): return 1
        if s.endswith('3'): return 1
        if s.endswith('5'): return 1
        if s.endswith('7'): return 1
        if s.endswith('9'): return 1
        return 0
    

    然后是另一个将字符串数除以2的支持例程:

    def divByTwo(s):
        new_s = ''
        add = 0
    
        for ch in s:
            new_dgt = (ord(ch) - ord('0')) // 2 + add
            new_s = '%s%d' % (new_s, new_dgt)
            add = oddsToOne(ch) * 5
    
        if new_s != '0' and new_s.startswith('0'):
            new_s = new_s[1:]
    
        return new_s
    

    最后,一些实际代码从十进制字符串生成二进制字符串:

    num = '12345'
    
    if num == '0':
        stack = '0'
    else:
        stack = ''
        while num != '0':
            stack = '%d%s'%(oddsToOne(num), stack)
            num = divByTwo (num)
    
    print(stack)
    

    请注意,如果您想实际使用它来填充实际位(而不是生成一串位),那么更改 ifelse 子句中发生的事情是一件简单的事情 .

    如上所述,它可能不是你能想到的最有效或最漂亮的Python代码,但它正在继续):

    12345
    11000000111001
    ||      |||  |
    ||      |||  +-     1
    ||      ||+----     8
    ||      |+-----    16
    ||      +------    32
    |+-------------  4096
    +--------------  8192
                    =====
                    12345
    

    因为这适用于数字的字符串表示,所以没有任意数字限制,例如64位整数的大小 . 一些示例值(为了便于阅读,稍微重新格式化为32位数字块):

    123456781234567812345678
    => 11010001001001001101100000011011
       01110110001110110010110110101111
       0111101001110
    
    99999999999999999999999999999999
    99999999999999999999999999999999
    99999999999999999999999999999999
    9999
    => 10010010010011010110100100101100
       10100110000110111110011101011000
       01011001001111000010011000100110
       01110000010111111001110001010110
       01110010000001000111000100001000
       11010011111001010101010110010010
       00011000010001010100000101110100
       01111000011111111111111111111111
       11111111111111111111111111111111
       11111111111111111111111111111111
       1111111111111
    

相关问题