2016-09-28 2 views
0

Я знаю, что есть встроенная функция преобразования двоичного кода в десятичный, но я думал, что брошу вызов себе и сделаю свое.Как избежать недопустимого токена при преобразовании двоичного в десятичный

Вот коды:

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, чтобы избежать недопустимую фишки, но это приводит меня к проблеме , Он не преобразует последний 1 на левой

binaryToDecimal(0b010001110) 

Так что выводит 14 вместо 142

Как я могу исправить это? Также есть способ, я могу просто сказать

binaryToDecimal(010001110) 

без получения недопустимого токена без использования префикса 0b?

Я использую Python 3.5

+5

Я не конечно, если вы знаете, но '0b010001110' не представляется внутренне ничем не отличающимся от' 142'. Они оба хранятся как совершенно обычные целые числа. 'list (str (0b010001110))' просто дает вам '['1', '4', '2']'. – Kevin

+0

'list (str (0b010001110))' не делает то, что вы думаете. –

+1

Что они сказали. Вы получаете 14, потому что 'exponent' начинается с 2 и 14 = 4 * 1 + 2 * 4 + 2. Если вы _really_ хотите выполнить свою собственную функцию двоичного преобразования, вам нужно передать двоичный arg в качестве строки, например, '010001110''. Или, как предлагает Аарон, список битов, которые могут быть целыми числами. –

ответ

0

Youre проблема в основном 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'] 
+0

Хорошо, я вижу, спасибо – acubal

1

0b010001110это уже целое с десятичным значением 142. If вы действительно хотите сделать свою собственную функцию двоичного преобразования, вам нужно передать двоичный аргумент как строку, например '010001110', или как список битов, которые могут быть строками, целыми числами или даже boolean значения True и False.

Как только у вас есть проблема с разрешением 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) 

, но вы можете реализовать его с «нормальными» арифметических операторов, если вы хотите

result = result * 2 + int(b) 
Смежные вопросы