## Binärzahl-Operationen mit Python ### Umwandlung Binär-Dezimal Nehmen wir `b = '101010'` als Beispiel. Jede Ziffer in diesem String steht an einer bestimmten Position: ^ Position | `0` | `1` | `2` | `3` | `4` | `5` | ^ Ziffer | `1` | `0` | `1` | `0` | `1` | `0` | Um die Binärzahl in eine Dezimalzahl umzurechnen, müssen wir potenzieren: $$1 \cdot 2^\color{red}{5} + 0 \cdot 2^\color{red}{4} + 1 \cdot 2^\color{red}{3} + 0 \cdot 2^\color{red}{2} + 1 \cdot 2^\color{red}{1} + 0 \cdot 2^\color{red}{0}$$ Zu jeder Ziffer gehört also die passende Zweierpotenz: ^ Position | `0` | `1` | `2` | `3` | `4` | `5` | ^ Ziffer | `1` | `0` | `1` | `0` | `1` | `0` | ^ Exponent | `5` | `4` | `3` | `2` | `1` | `0` | ^ Potenz | `32` | `16` | `8` | `4` | `2` | `1` | Die Schwierigkeit bei diesem Code ist, dass **Position und Exponent genau gegenteilig sind**: Die Position startet bei $0$ und zählt hoch, der Exponent startet bei $5$ und zählt herunter. Dieses Problem kann man unterschiedlich lösen. Mögliche Ansätze sind: 1. **Zwei separate Variablen**: Eine für die Position und eine für den Exponenten. 2. **Binärstring umkehren**, also aus `'101010'` wird `'010101'`: Jetzt stimmen Position und Exponent überein. [[.:binary_collection#rueckwaerts|Hier]] hat es Ideen. 3. Das Zwischenresultat wird **fortlaufend mit 2 multipliziert**. ### Umwandlung Dezimal-Binär Der {{gf_informatik:gfif_zahlensysteme_dossier_hof.pdf#page.8|Restwertalgorithmus wird im Dossier}} erklärt: Wir bilden fortlaufend den Rest und den Ganzzahl-Quotienten. Der Algorithmus funktioniert übrigens für alle Basen! ### Binär-Addition Die Addition von Binärzahlen erfolgt wie die schriftliche Addition von Dezimalzahlen: Jede Stelle wird für sich addiert, dabei ergibt sich der Wert für diese Stelle im Resultat sowie der Übertrag ("Behalte") für die nächste Stelle. Ein Übertrag erfolgt, sobald die Stellensumme die Zahl 2 erreicht. {{.:binary_solutions:pasted:20260428-152720.png?nolink&283}} Umsetzungsidee: * Beide Strings paarweise [[gf_informatik:zahlensysteme:binary_collection#rueckwaerts|von rechts nach links]] durchlaufen. * An jeder Position das Bit aus `a` und `b` sowie einen allfälligen Übertrag addieren. * Achtung: Die einzelnen Positionen eines Strings sind die Buchstaben `'0'` oder `'1'`, nicht die Zahlen `0` oder `1`. Wandle sie mit `int()` in Zahlen um! * Das Resultat-Bit an der Position ist `1`, wenn die Summe `1` oder `3` ist, sonst `0`. * Tipp: also genau das Resultat von `summe % 2`... * Der Übertrag auf die nächste Stelle ist `1` wenn die Summe `2` oder `3` ist. * Also genau dem Resultat von ...? ### Binär-Subtraktion Für die Subtraktion im Binärsystem wird das {{gf_informatik:gfif_zahlensysteme_dossier_hof.pdf#subsection.3.4|Zweierkomplement}} des Subtrahends _addiert_. Wir benötigen also Code für das Berechnen des Zweierkomplements: 1. Auffüllen mit Nullen auf die gewünschte Anzahl Bits 2. Invertieren 3. `"1"` addieren mit Binär-Addition Der Code aus der vorherigen Aufgabe wird für die Addition benötigt. ### Ausprobieren Kopiere alle Funktionen oben in die gleiche Python-Datei. Überprüfe danach die Funktionsweise: a_dec = 42 b_dec = 19 a_bin = decimal_to_binary(a_dec) b_bin = decimal_to_binary(b_dec) difference_bin = binary_subtraction(a_bin, b_bin, 8) difference_dec = binary_to_decimal(difference_bin) print(f"{a_dec} - {b_dec} = {a_bin} - {b_bin} = {difference_bin} = {difference_dec}") Resultat: 42 - 19 = 101010 - 10011 = 00010111 = 23