Python binär rechnen?
An alle Programmierer da draußen, wie ist es bei Pyth0n möglich,
beim drücken von einer taste X eine Binäre 1 zu erstellen und beim drücken einer Taste Y eine Binäre 0 zu erstellen und damit zu rechnen
bsp.: ich klicke 3mal X (111) dann ein plus(+) danach 2mal Y und 1 mal X (100 )
111+100 = 1011
wie kann man sowas in Pyth0n umsetzen ?
2 Antworten
Ich fand den Ansatz von AnonYmus19941 sehr cool. Die Umwandlung von X und Y in 1 und 0 übernehme ich mal ganz frech:
rechnung = raw_input('Rechnung eingeben: ').replace('X', '1').replace('Y', '0')
teile = rechnung.split('+')
Danach erhalte ich eine Liste, wobei jedes Element ein String (!) eines Summanden in Binär ist.
Ab hier schlage ich vor, die Funktion int und bin zu verwenden:
Ergebnis = bin(int(teile[0], 2) + int(teile[1], 2))
int() nimmt nämlich nicht nur ein Argument zur Umwandlung in Integer, sondern nimmt auch die Basis, zu der es umgeformt werden soll (im Falle von Binär ist das 2). bin() konvertiert eine Zahl in Binär. Wir vollziehen die Rechnung also als normale Zahl und gehen dann zurück zu binär.
Das Ergebnis ist dann aber auch als binär formatiert, z.B.:
print Ergebnis
>>> 0b1011
Ich kann dir nur ein Grundkonzept liefern:
rechnung = raw_input('Rechnung eingeben: ').replace('X', '1').replace('Y', '0')
teile = rechnung.split('+')
for i in range(len(teile)):
temp = teile[i]
teile[i] = ''
for j in temp:
teile[i] = j + teile[i]
for i in teile:
teile = int(teile, 2)
So bekommst du eine Liste aller Summanden ...
Ups, ja, ich habe ein paar Versuche gebraucht und den falschen kopiert ...
Richtig müssten die letzten beiden Zeilen folgendermaßen lauten:
for i in range(len(teile)):
teile[i] = int(teile[i], 2)
Da "YXX" in Binär "100" übersetzt ist, er aber von links nach rechts iteriert, erhalte ich am Ende deiner Schleife für teile[1] = "001".
Laut der Frage sollte die Binärzahl offenbar von hinten nach vorne aufgebaut werden:
2mal Y und 1 mal X (100 )
Daher dreht diese alle Binärzahlen um, sodass aus "YYX" - eigentlich "001" - eine "100" wird.
int(teile[i] ... hatte ich mir noch erschlossen, aber lustigerweise dann aufgehört zu denken. Klar, so funktioniert es auch.
dass YYX = 100 sein soll, halte ich eher für einen Flüchtigkeitsfehler. Aber du hast Recht, wenn man die Frage wörtlich nimmt, müsste man es umdrehen. Und wenn ich so drüber nachdenke, ist es auch sinnvoll, wenn man bedenkt, wie eine Binärzahl aufgebaut wird.
Ich versuche gerade nachzuvollziehen, welchen Lösungsweg zu gehst. "teile" ist ja eine Liste aus Strings. "j in temp" sind also alle Binärzahlen als String ("1" oder "0"). Da "YXX" in Binär "100" übersetzt ist, er aber von links nach rechts iteriert, erhalte ich am Ende deiner Schleife für teile[1] = "001"
In der zweiten Schleife iterierst du nicht über die Listeneinträge, sondern wieder über die einzelnen Binärzahlen als String. Bei int(teile,2) kracht es deshalb.