我正在做一个colledge赋值,让我们创建一个python程序,将二进制转换为十进制而不使用bin()函数或list()。我计划将每个1和0存储在一个函数中,该函数将在以后相乘。但是,我不确定我该怎么做呢
答案 0 :(得分:3)
好吧,您可以将二进制数作为字符串传递,并以相反的顺序迭代它,将每个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一样,你也可以在循环中使用枚举而不是manuel计数器,它可以达到同样的目的。
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
答案 1 :(得分:0)
使用列表理解的简单单行:
decimal = sum(int(bit) * 2**rank for rank, bit in enumerate(reversed(binary)))
答案 2 :(得分:0)
无需反转位串或使用索引。您可以使用按位运算符进行此简单转换。
这是一些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
的算术值为零,而True
的算术值为1,因此在算术表达式中(b == '1')
的行为类似于b
等于'1'
,否则为0。
如果您不习惯使用<<
左移位和|
按位OR运算符,则可以使用乘法和加法。只需更换
n = (n << 1) | (b == '1')
与
n = (n * 2) + (b == '1')