2016-04-20 3 views
-4

Im, выполняющее назначение colledge, которое позволяет нам создать программу python для преобразования двоичного кода в десятичный без использования функции bin() или списка(). Я планирую, чтобы каждый 1 и 0 сохранялся в функции, которая будет умножаться позже. Тем не менее, я не уверен, как я могу это сделать.Python-Преобразование двоичного в десятичное

+0

Вы читали о процессе. Представьте себе, как бы вы конвертировали небольшое число, затем немного больше и создавали оттуда –

+0

Преобразование - это не проблема, связанная с имением, является ли сохранение двоичных чисел проблемой – Ruben

+0

@Ruben number - это число (это ' d всегда хранятся в двоичном виде как таковые, на машине). Таким образом, вы можете подумать о сохранении своего представления base-2. Как хранить его как строку? – Roberto

ответ

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 

EDIT: Как Byte Commander сделал, вы также можете использовать перечисление в цикле вместо счетчика Мануэль, он служит той же цели.

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 
+0

вы можете использовать enumerate() вместо переменной счетчика вручную. –

+0

Я сделал это простым способом, так что его можно легко понять, но ваш однострочный файл более эффективен. – Aurel

+0

. Ваш цикл for fine, но 'enumerate (b)' было бы так, как вы должны использовать в реальном коде, это много чище и проще, чем вручную заботиться о переменной счетчика. –

0

Простой один вкладыш, используя список понимание:

decimal = sum(int(bit) * 2**rank for rank, bit in enumerate(reversed(binary))) 
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 имеет арифметическое значение одного, поэтому в арифметическом выражении (b == '1') ведет себя как 1, если b равно '1' и 0 в противном случае.

Если вы не чувствуете себя комфортно с помощью сдвига левого разряда << и | побитовых операторов ИЛИ, вместо этого вы можете использовать умножение и добавление. Просто замените

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

с

n = (n * 2) + (b == '1') 
Смежные вопросы