将二进制转换为十进制时如何避免无效令牌

时间:2016-09-28 13:16:49

标签: python python-3.x

我知道有一个内置函数将二进制转换为十进制但我认为我挑战自己并制作自己的。

以下是代码:

def binaryToDecimal(binary):
    binaryList = list(str(binary))
    exponent = len(binaryList) - 1
    decimal = 0

    for char in binaryList:
        bit = int(char)
        decimal += bit * (2 ** exponent)
        exponent -= 1

    print(decimal)

问题是,我知道如果我想用0开始我的二进制文件,我必须使用0b前缀来避免无效的令牌,但它会导致我遇到问题。它不会转换左边的最后一个

binaryToDecimal(0b010001110)

因此输出14而不是142

我该如何解决?还有一种方法我可以说

binaryToDecimal(010001110) 

没有使用0b前缀而没有获得无效的令牌?

我正在使用Python 3.5

2 个答案:

答案 0 :(得分:1)

0b010001110 已经一个十进制值为142的整数。如果你真的想做自己的二进制转换函数,你需要传递二进制arg作为一个字符串,例如' 010001110',或者作为位列表,可以是字符串,整数,甚至是布尔值TrueFalse

解决str vs int输入问题后,可以采用更简单的方式进行转换。没有必要乱用指数:在循环中只是将当前结果向左移位一位并插入下一位。像这样:

def bin_to_int(bits):
    result = 0
    for b in bits:
        result = (result << 1) | int(b)
    return result

# Test
data = [
    '0',
    '1',
    '110',
    '001101',
    '10001110', 
    '000010001110', 
    '11000000111001',
]

for bits in data:
    print(bits, int(bits, 2), bin_to_int(bits))

<强>输出

0 0 0
1 1 1
110 6 6
001101 13 13
10001110 142 142
000010001110 142 142
11000000111001 12345 12345

我的测试代码也使用内置的int构造函数进行转换,以验证我的bin_to_int函数是否正常运行。

这一行完成了大部分工作,使用了按位运算符

result = (result << 1) | int(b)

但你可以用&#34; normal&#34;来实现它。算术运算符,如果你喜欢

result = result * 2 + int(b)

答案 1 :(得分:0)

你的问题主要是binaryList = list(str(binary))str(0b010001110)会返回'142',而非'0b101010',如您所料。

因此,binaryList['1', '4', '2']

巧合的是1 * 2**2 + 4 * 2**1 + 2等于14,这给人的印象是你的功能并不是最后一位数。

但是,如果您正在运行“0b101010作为输入”,则会获得10

将二进制表示形式化为字符串的解决方案是传递给format

list("{0:b}".format(0b010001110))

返回

['1', '0', '0', '0', '1', '1', '1', '0']