Nehmen wir b = '101010' als Beispiel. Jede Ziffer in diesem String steht an einer bestimmten Position:

Ziffer:   101010
Position: 012345

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 Potenz:

Ziffer:   101010
Position: 012345
Potenz:   543210

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. Zwei 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. Allerdings haben wir nie besprochen, wie man diese Umkehrung einfach erreichen kann.
  3. Lösung unten: das Zwischenresultat wird fortlaufend mit 2 multipliziert.

Lösung

Der Restwertalgorithmus wird im Dossier erklärt: Wir bilden fortlaufend den Rest und den Ganzzahl-Quotienten. Der Algorithmus funktioniert übrigens für alle Basen!

Lösung

Umsetzungsidee:

  • Beide Strings paarweise von rechts nach links durchlaufen.
  • An jeder Position das Bit aus a und b sowie einen allfälligen Übertrag addieren.
  • Das Resultat-Bit an der Position ist 1, wenn die Summe 1 oder 3 ist, sonst 0.
    • Tipp: also genau dem 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

def invert(b):
    """Erstellt einen neuen String, wobei 0en und 1en vertauscht sind."""
    result = ""
    for digit in b:
        if digit == "0":
            result = result + "1"
        else:
            result = result + "0"
    return result
 
def zweierkomplement(b, stellen=8):
    """Berechnet das Zweierkomplement von b in der gewünschten Anzahl Stellen."""
    # 1) Auffüllen auf stellen bits
    b = fill_zeros(b, stellen)
    # 2) Invertieren (1->0, 0->1)
    b = invert(b)
    # 3) Addiere 1
    return binary_add(b, "1")
 
def binary_subtraction(a, b, stellen=8):
    """Subtraktion als Addition des Zweierkomplements."""
    complement = zweierkomplement(b, stellen)
    result = binary_add(a, complement)
    result = result[-stellen:]  # Vorderstes Bit auslassen
    return result

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
  • gf_informatik/zahlensysteme/binary_solutions.1774936206.txt.gz
  • Zuletzt geändert: 2026-03-31 05:50
  • von hof