【问题标题】:Python-Converting binary to decimalPython-将二进制转换为十进制
【发布时间】:2016-08-13 01:21:20
【问题描述】:

我正在做一个大学作业,让我们创建一个 python 程序来将二进制转换为十进制,而不使用 bin() 函数或 list()。我计划将每个 1 和 0 存储在一个稍后将相乘的函数中。但是,我不确定我该怎么做

【问题讨论】:

  • 阅读有关该过程的信息。想象一下如何转换一个小数字,然后转换一个稍大的数字并从那里开始构建
  • 转换不是我遇到的问题,是二进制数的存储问题
  • @Ruben 一个数字就是一个数字(它总是以二进制形式存储在机器上)。因此,您实际上可能正在考虑存储它的 base-2 表示。将其存储为字符串怎么样?
  • 你确定你描述的作业正确吗?在这里使用内置的bin() 函数没有意义,因为它将十进制转换为二进制。

标签: python binary decimal


【解决方案1】:

好吧,您可以将二进制数作为字符串传递,并以相反的顺序对其进行迭代,将每个 0 或 1 乘以 2^n,其中 n 是在每个循环周期递增的数字。

def bin2dec(b):
    number = 0
    counter = 0
    for i in b[::-1]: # Iterating through b in reverse order
        number += int(i)*(2**counter)
        counter += 1

    return number

bin2dec("101010") # 42

编辑: 就像 Byte Commander 所做的那样,您也可以在循环中使用 enumerate 而不是手动计数器,它具有相同的目的。

def bin2dec(b):
    number = 0
    for idx, num in enumerate(b[::-1]): # Iterating through b in reverse order
        number += int(num)*(2**idx)

    return number

【讨论】:

  • 你可以使用 enumerate() 代替手动计数器变量。
  • 我做的很简单,所以很容易理解,但是你的单线效率更高
  • 您的 for 循环很好,但 enumerate(b) 本来应该是您在实际代码中使用的方式,它比手动处理计数器变量更干净、更容易。
  • 我知道,但是对于一些目标是理解算法的大学作业,我至少希望通过这种方式更清楚地说明
  • 我从来没有真正想过这一点,我一直认为 python 只会乘以整个二进制值(其中 101001 x 2^2 等)。另外,你能澄清一下 def(b) 函数是做什么的吗?
【解决方案2】:

使用列表理解的简单单行:

decimal = sum(int(bit) * 2**rank for rank, bit in enumerate(reversed(binary)))

【讨论】:

    【解决方案3】:

    无需反转位串或使用索引。您可以使用按位运算符进行这个简单的转换。

    这里有一些 Python 2 / Python 3 代码:

    from __future__ import print_function
    
    def bin_to_dec(bits):
        n = 0
        for b in bits:
            n = (n << 1) | (b == '1')
        return n
    
    # Test
    
    for i in range(16):
        bits = format(i, 'b')
        n = bin_to_dec(bits)
        print('{0:2}: {1:>4} {2:2}'.format(i, bits, n))
    

    输出

     0:    0  0
     1:    1  1
     2:   10  2
     3:   11  3
     4:  100  4
     5:  101  5
     6:  110  6
     7:  111  7
     8: 1000  8
     9: 1001  9
    10: 1010 10
    11: 1011 11
    12: 1100 12
    13: 1101 13
    14: 1110 14
    15: 1111 15
    

    这是有效的,因为False 的算术值为 0,而True 的算术值为 1,因此在算术表达式中,如果 b 等于 '1'(b == '1') 的行为类似于 1,否则为 0。

    如果您不习惯使用&lt;&lt; 左位移位和| 位或运算符,您可以改用乘法和加法。简单替换

    n = (n << 1) | (b == '1')
    

    n = (n * 2) + (b == '1')
    

    【讨论】:

      猜你喜欢
      • 2020-08-06
      • 2012-06-26
      • 1970-01-01
      • 2017-02-04
      • 2021-02-16
      • 1970-01-01
      • 2016-09-15
      • 2014-11-07
      相关资源
      最近更新 更多