2015-10-21 4 views
0

пытается преобразовать двоичный код в десятичный, используя цикл while. Я сделал это много, но код, кажется, просто добавляет все введенные 1s, т.е. 1101011 = 5. Любые идеи о том, что я делаю неправильно? Приветствия.Преобразование двоичного в десятичное с использованием цикла while?

Редактировать: Чтобы быть ясным, я знаю, что могу использовать более простые методы, но получение ответа несущественно, пытаясь разработать алгоритм while while.

import sys 
binary = sys.argv[1] 
answer = 0 
currentDigit = 0 
currentPower = len(binary) - 1 

while currentPower >= 0: 
    placeHolder = int(binary[currentDigit]) 
    answer = answer + (placeHolder ** currentPower) 
    currentDigit += 1 
    currentPower -= 1 

print answer 

ответ

1

1 в n'th месте должен представлять 2 п, а не 1 п.

answer = answer + (placeHolder ** currentPower) 
        ^^^^^^^^^^^ 
       this is 1 in your code 

Надеюсь, вы увидите, что исправить.

+0

Конечно. Спасибо. –

0

, если суффикс 0b с двойной в оболочке, это даст вам десятичную

>>> 0b111 
7 

Другой путь другой, чем int:

>>> def my_bin_dec(x): 
...  return eval("{:s}".format('0b' +x)) 
... 
>>> my_bin_dec('111') 
7 

Примечание: eval небезопасно использовать, но вы могут использовать ast.literal_eval

0

Вам нужно изменить:

answer = answer + (placeHolder ** currentPower) 

к:

answer = answer + placeHolder * 2 ** currentPower 

или более сжато:

answer += placeHolder * 2 ** currentPower 

Надеется, что это помогает.

0

Вот еще один способ сделать это, используя цикл while. Это выполняет сдвиг влево на величину бега, а затем добавляет 1, если бит равен 1:

binary = '11001101101010101' 
value = 0 
i = 0 
while i < len(binary): 
    value <<= 1 # Shift left 1 bit position. Same as multiplying by 2. 
    value += (binary[i] == '1') 
    i += 1 

assert value == int(binary, 2) 

Это даже проще (и немного быстрее) с цикл:

binary = '11001101101010101' 
value = 0 
for bit in binary: 
    value <<= 1 
    value += (bit == '1') 

assert value == int(binary, 2) 

Наконец, это можно сделать это в одной строке. За счет удобочитаемости кода это, по-видимому, выше, чем указанные выше петель:

value = sum([(1<<i) if bit=='1' else 0 for i,bit in enumerate(reversed(binary))]) 
Смежные вопросы