2016-04-20 15 views
-4

Im a colledge Zuordnung zu tun, das wir ist ein Python-Programm erstellen binäre zu konvertieren, ohne die Behälter() Funktion oder Liste() in Dezimalzahlen. Ich plane, jede 1 und 0 in einer Funktion zu speichern, die später multipliziert wird. Ich bin mir jedoch nicht sicher, wie ich das tun sollPython-Converting binär dezimal

+0

eine Lese über den Prozess. Stellen Sie sich vor, wie Sie die eine kleine Zahl umwandeln würden, dann ein etwas größeren und bauen von dort –

+0

Konvertieren ist nicht das Problem, das mit im, ist die Speicherung der binären Zahlen wird das Problem – Ruben

+0

@Ruben eine Zahl eine Zahl (es d immer binär auf einer Maschine gespeichert). Sie könnten also tatsächlich darüber nachdenken, seine Basis-2-Repräsentation zu speichern. Wie wäre es, es als String zu speichern? – Roberto

Antwort

3

Nun, Sie könnten die Binärzahl als Zeichenfolge übergeben, und durchlaufen Sie es in umgekehrter Reihenfolge, multipliziert jede 0 oder 1 mit 2^n, wobei n ist eine Zahl, die bei jedem Schleifenzyklus inkrementiert wird.

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: Wie Byte Kommandant tat, konnte man auch in der Schleife anstelle eines manuel Zähler verwenden aufzählen, sie dem gleichen Zweck dienen.

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

können Sie enumerate() anstelle der manuellen Zählervariable verwenden. –

+0

Ich habe ihm die einfache Art und Weise, so kann es leicht zu verstehen, aber Ihre Einzeiler sind effiziente – Aurel

+0

Ihr for-Schleife in Ordnung ist, aber 'enumerate (b)' wäre so, wie Sie in echtem Code gewesen verwenden sollten, ist es viel ist sauberer und einfacher als die manuelle Pflege einer Zählervariable. –

0

einfache Einzeiler mit Liste Verständnis:

decimal = sum(int(bit) * 2**rank for rank, bit in enumerate(reversed(binary))) 
0

Es gibt keine Notwendigkeit, die Bit-String oder die Verwendung Indizes zu umkehren. Sie können bitweise Operatoren für diese einfache Transformation verwenden.

Hier einiger Python 2/Python 3-Code:

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)) 

Ausgang

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 

Dies funktioniert, weil False den arithmetischen Wert von Null hat, und True hat den arithmetischen Wert von eins, so in einem arithmetischen Ausdruck (b == '1') verhält sich wie 1, wenn b gleich '1' und 0 sonst.

Wenn Sie sich nicht wohl fühlen mit den Bits << linkes Bit und | bitweise OR-Operatoren, können Sie stattdessen Multiplikation und Addition verwenden. Einfach

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

mit

n = (n * 2) + (b == '1') 
Verwandte Themen