为什么这种二进制到十进制的转换不适用于偶数



这里是python的新手,我尝试了以下代码:

binary = [0, 0, 0, 0, 1, 1, 0, 0] 
def bin_to_dec(binary):
num = 0
ini = 0
sum1 = 0
print()
#print("Binary: ",binary)
for i in binary[::-1]:        
num = 2**(ini) * binary[-i]
print("Binary -i: " , binary[-i])
print("num: ", num)
sum1 = sum1 + num
print("i: ", i)
print("ini: ", ini)
print("Sum: " , sum1)
print()
ini = ini + 1
print("Result in integer: ", sum1)
return sum1
bin_to_dec(binary)

就像问题所说的,如果列表中的最后一个项目是1,它就有效,但如果它是0,它就无效。我不明白为什么。

由于您已经在binary中进行迭代,因此应该只使用i而不是binary[-1],这是关键问题。

  • i为您提供每个索引的实际值。
    • 如果同时需要索引和值,请使用for idx, val for enumerate(binary)
    • 如果你只是想要索引,for idx in range(len(binary))就足够了
  • binary[-i]将根据您使用的01而有所不同。
    • 例如,对于第二个索引,binary[-i]将是binary [-0],这是不正确的

固定代码:

binary = [0, 0, 0, 0, 1, 1, 0, 0] 
def bin_to_dec(binary):
num = 0
ini = 0
sum1 = 0
print()
#print("Binary: ",binary)
for i in binary[::-1]:        
num = 2**(ini) * i
print("i: " , i)
print("num: ", num)
sum1 = sum1 + num
print("ini: ", ini)
print("Sum: " , sum1)
print()
ini = ini + 1
print("Result in integer: ", sum1)
return sum1
bin_to_dec(binary)

样品:https://ideone.com/edm8Rj

您也可以使用不同的方法,例如以下方法:

def bin_to_dec(binary):
num = 0
for i in range(len(binary)):
num += binary[(-i-1)]*(2**i)
return num

您的代码将二的幂乘以二进制[-i],您希望它是从末尾开始的第i位,但您的i变量不包含索引,它包含该位置的位。因此,结果将由第一位和最后一位(索引-0和-1(的组合形成,而不是您所期望的。

一种更简单的方法是在比特中向前移动,并在添加每个比特之前将先前的结果乘以2

num = 0
for bit in binary:
num = num * 2 + bit

最新更新