Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
gf_informatik:zahlensysteme:binary_solutions [2026-04-21 05:40] – [Binär-Addition] hofgf_informatik:zahlensysteme:binary_solutions [2026-05-25 05:20] (aktuell) hof
Zeile 1: Zeile 1:
 ## Binärzahl-Operationen mit Python ## Binärzahl-Operationen mit Python
-<html><script type="module" src="https://bottom.ch/editor/stable/bottom-exercise.js"></script></html>+
 ### Umwandlung Binär-Dezimal ### Umwandlung Binär-Dezimal
  
Zeile 18: Zeile 18:
 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. 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:+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.    1. **Zwei separate Variablen**: Eine für die Position und eine für den Exponenten.
Zeile 24: Zeile 24:
    3. Das Zwischenresultat wird **fortlaufend mit 2 multipliziert**.    3. Das Zwischenresultat wird **fortlaufend mit 2 multipliziert**.
  
-<html><bottom-exercise session="page" id="bin2dec">+<bottom-exercise session="page" id="bin2dec">
 <script type="text/x-starter"> <script type="text/x-starter">
 def binary_to_decimal(b): def binary_to_decimal(b):
Zeile 46: Zeile 46:
 print(binary_to_decimal("101010")) print(binary_to_decimal("101010"))
 </script> </script>
-</bottom-exercise></html>+</bottom-exercise>
  
  
Zeile 53: Zeile 53:
 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! 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!
  
-<html><bottom-exercise session="page" id="dec2bin">+<bottom-exercise session="page" id="dec2bin">
 <script type="text/x-starter"> <script type="text/x-starter">
 def decimal_to_binary(d): def decimal_to_binary(d):
Zeile 75: Zeile 75:
 print(decimal_to_binary(42)) print(decimal_to_binary(42))
 </script> </script>
-</bottom-exercise></html> +</bottom-exercise>
 ### Binär-Addition ### 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: Umsetzungsidee:
   * Beide Strings paarweise [[gf_informatik:zahlensysteme:binary_collection#rueckwaerts|von rechts nach links]] durchlaufen.   * 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.   * 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`.   * 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`...     * Tipp: also genau das Resultat von `summe % 2`...
Zeile 86: Zeile 91:
     * Also genau dem Resultat von ...?     * Also genau dem Resultat von ...?
  
-<html><bottom-exercise id="binary-add">+<bottom-exercise id="binary-add" showsolution>
 <script type="text/x-starter"> <script type="text/x-starter">
 def binary_add(a, b): def binary_add(a, b):
Zeile 94: Zeile 99:
     # 3) An jeder Stelle: Resultat und Übertrag berechnen.     # 3) An jeder Stelle: Resultat und Übertrag berechnen.
  
-print(binary_add("101010", "10111"))+print(binary_add("11001011", "10101110"))
 </script> </script>
 <script type="text/x-test"> <script type="text/x-test">
Zeile 123: Zeile 128:
         digit_b = int(b[index])         digit_b = int(b[index])
         sum = digit_a + digit_b + carry         sum = digit_a + digit_b + carry
-        bit = sum % 2 +        bit = sum % 2     # Resultat-Bit ist 1, wenn die Summe ungerade ist 
-        carry = sum // 2+        carry = sum // 2  # Übertrag ist 1, wenn die Summe 2 oder 3 ist
         out = str(bit) + out         out = str(bit) + out
  
Zeile 135: Zeile 140:
 print(binary_add("101010", "10111")) print(binary_add("101010", "10111"))
 </script> </script>
-</bottom-exercise></html>+</bottom-exercise>
  
  
 ### Binär-Subtraktion ### 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:
  
-<nodisp 2> +1. Auffüllen mit Nullen auf die gewünschte Anzahl Bits 
-++++Lösung| +2. Invertieren 
-<html><bottom-editor session="page">+3. `"1"` addieren mit Binär-Addition 
 + 
 +Der Code aus der vorherigen Aufgabe wird für die Addition benötigt. 
 + 
 +<bottom-exercise id="binary-subtract" showsolution style="max-height:20lh;"> 
 +<script type="text/x-starter"> 
 +def invert(b): 
 +    """Erstellt einen neuen String, wobei 0en und 1en vertauscht sind.""" 
 + 
 +def zweierkomplement(b, stellen=8): 
 +    """Berechnet das Zweierkomplement von b in der gewünschten Anzahl Stellen.""" 
 +    # 1) Auffüllen auf stellen bits 
 +    # 2) Invertieren (1->0, 0->1) 
 +    # 3) Addiere 1 
 + 
 +def binary_subtraction(a, b, stellen=8): 
 +    """Subtraktion als Addition des Zweierkomplements.""" 
 + 
 +print(binary_subtraction("1000", "111")) 
 +</script> 
 +<script type="text/x-test"> 
 +assert binary_subtraction("1000", "111") == "00000001" 
 +</script> 
 +<script type="text/x-solution"> 
 +def fill_zeros(b, digits): 
 +    """Füllt einen Binärstrings links bis zu digits Stellen mit Nullen auf.""" 
 +    while len(b) < digits: 
 +        b = "0" + b 
 +    return b 
 + 
 +def binary_add(a, b): 
 +    """Addiert zwei Binärzahlen beliebiger Länge.""" 
 +    n = max(len(a), len(b)) 
 +    a = fill_zeros(a, n) 
 +    b = fill_zeros(b, n) 
 +     
 +    out = "" 
 +    carry = 0  # Übertrag 
 +    index = n - 1 
 +    while index >= 0: 
 +        digit_a = int(a[index]) 
 +        digit_b = int(b[index]) 
 +        sum = digit_a + digit_b + carry 
 +        bit = sum % 2 
 +        carry = sum // 2 
 +        out = str(bit) + out 
 + 
 +        index = index - 1 
 +         
 +    if carry != 0: 
 +        out = str(carry) + out 
 +    return out 
 +    
 def invert(b): def invert(b):
     """Erstellt einen neuen String, wobei 0en und 1en vertauscht sind."""     """Erstellt einen neuen String, wobei 0en und 1en vertauscht sind."""
Zeile 168: Zeile 226:
     result = result[-stellen: # Vorderstes Bit auslassen     result = result[-stellen: # Vorderstes Bit auslassen
     return result     return result
-</bottom-editor></html+</script> 
-++++ +</bottom-editor> 
-</nodisp>+
  
 ### Ausprobieren ### Ausprobieren
Zeile 176: Zeile 234:
 Kopiere alle Funktionen oben in die gleiche Python-Datei. Überprüfe danach die Funktionsweise: Kopiere alle Funktionen oben in die gleiche Python-Datei. Überprüfe danach die Funktionsweise:
  
-<html><bottom-editor session="page">+<bottom-editor session="page">
 a_dec = 42 a_dec = 42
 b_dec = 19 b_dec = 19
Zeile 184: Zeile 242:
 difference_dec = binary_to_decimal(difference_bin) difference_dec = binary_to_decimal(difference_bin)
 print(f"{a_dec} - {b_dec} = {a_bin} - {b_bin} = {difference_bin} = {difference_dec}") print(f"{a_dec} - {b_dec} = {a_bin} - {b_bin} = {difference_bin} = {difference_dec}")
-</bottom-editor></html>+</bottom-editor>
  
 Resultat: Resultat:
  • gf_informatik/zahlensysteme/binary_solutions.1776750028.txt.gz
  • Zuletzt geändert: 2026-04-21 05:40
  • von hof