Brauche Hilfe bei diesem Python Code (Binärrechner)?
Hallo, ich sollte einen Binärrechner erstellen, der 2 Binärzahlen miteinander addiert, aber ich schaffe es nicht in add_2bit, add_binary zu benutzten hier die Aufgabe.
add_binary: Die Funktion soll zwei Binärzahlen addieren, die sie als Parameter übergeben bekommt. Die Funktion soll die Summe der beiden Binärzahlen zurückgeben. Verwenden sie die Funktion add_3bit für einzelne Additionsschritte für die Addition.
add_2bit: Die Funktion soll zwei 1 bit Zahlen addieren, die sie als Parameter übergeben bekommt. Die Funktion soll die Summe der beiden Binärzahlen zurückgeben und ob ein Übertrag stattgefunden hat (z.B. 1 + 1 = 0, Übertrag 1). Verwenden Sie die Funktion add_binary für die Addition.
add_3bit: Die Funktion soll drei 1 bit Zahlen addieren, die sie als Parameter übergeben bekommt (2 Zahlen + 1 Übertrag). Die Funktion soll die Summe der drei Binärzahlen zurückgeben und ob ein Übertrag stattgefunden hat (z.B. 1 + 1 + 1 = 1, Übertrag 1). Verwenden Sie die Funktion add_2bit für einzelne Additionsschritte für die Addition.
Hier der Code
2 Antworten
In meinen Augen passt das nicht so ganz zusammen, wegen der zirkulären Abhängigkeit. Wenn dann müßtest Du in add_2bit für den Fall, daß beide Eingaben nur die Länge 1 haben breaken bzw. nciht mehr auf add_binary zurückgreifen.
Hier noch etwas grundlegendes:
def add_2bit(bit1, bit2, carry=0):
# Add two 1-bit numbers with a carry using add_binary
bit1, bit2, carry = int(bit1), int(bit2), int(carry)
sum_result = (bit1 + bit2 + carry) % 2
carry = (bit1 + bit2 + carry) // 2
return str(sum_result), str(carry)
das kann man so machen, einfacher wäre aber:
def add_2bit (a,b):
reutrn a&b,a^b # Carry = AND, Sum = XOR (Halbaddierer)
Da das eine Aufgabe ist, die auf Rekursion hinauslaufen würde (add_binary->add_3bit->add_2bit->add_binary...) sehe ich eigentlich nur einen Ausweg: Du brauchst eine Abbruchbedingung der Rekursion und diese muss nach Aufgabenstellung in add_binary liegen. Es ergibt keinen Sinn, wenn add_binary zwei Werte bekommt und sie dann noch mal an add_3bit weiterleitet.
Also macht add_binary eine Fallunterscheidung: Wenn beide Werte nur 1 Bit groß sein, übernimmt es die Addition selbst. Eigentlich wird dadurch die Aufgabe aber witzlos, weil der Übertrag dann ja auch schon dort gehandhabt werden muss... aber gut, vielleicht liegt die Idee woanders oder ich sehe was nicht.
Die eigentlich Idee besteht ja aus meiner Sicht in einem Ripple-Carry-Addierer. add_2bit ist ein Halbaddierer (und-Funktion für Übertrag, xor Funktion für Addition, nur 2 Bit als Eingabe), add_3bit ein Volladdierer (3 Bit als Eingabe, 2 Halbaddierer, oder-Verknüpfung für Übertrag oder so ähnlich)
Ja, könnte ein Fehler in der Aufgabe sein. Die Nachbildung eines klassischen Addierwerkes wäre ja genau auch meine Vermutung. Ich hätte die zirkuläre Abhängigkeit ggf. genau so aufgelöst, wie man eine (unendliche) Rekursion verhindert: Eben mit Abbruchbedingung... Indem sich das gesamte Addierwerk für 2 Bits verhält wie ein Halbaddierer. Wie gesagt... irgendwie wird dann der Halbaddierer und die Aufgabe witzlos.
Ich sehe nicht, wie eine Rekursion die zirkuläre Abhängigkeit aufbrechen soll, vielmehr scheint mir die Aufgabe hier fehlerhaft.
Das riecht der BEschreibung nach eher nach HA, VA, Addierwerk (seriell), nur ergibt die Abhängigkeit des HA auf das Addierwerk wenig Sinn.