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:
'101010' wird '010101': Jetzt stimmen Position und Exponent überein. Hier hat es Ideen.Der Restwertalgorithmus wird im Dossier erklärt: Wir bilden fortlaufend den Rest und den Ganzzahl-Quotienten. Der Algorithmus funktioniert übrigens für alle Basen!
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.
Umsetzungsidee:
a und b sowie einen allfälligen Übertrag addieren.'0' oder '1', nicht die Zahlen 0 oder 1. Wandle sie mit int() in Zahlen um!1, wenn die Summe 1 oder 3 ist, sonst 0.summe % 2…1 wenn die Summe 2 oder 3 ist.Für die Subtraktion im Binärsystem wird das Zweierkomplement des Subtrahends addiert. Wir benötigen also Code für das Berechnen des Zweierkomplements:
"1" addieren mit Binär-AdditionDer Code aus der vorherigen Aufgabe wird für die Addition benötigt.
Kopiere alle Funktionen oben in die gleiche Python-Datei. Überprüfe danach die Funktionsweise:
Resultat:
42 - 19 = 101010 - 10011 = 00010111 = 23