Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
| gf_informatik:zahlensysteme:binary_solutions [2026-04-21 05:40] – [Binär-Addition] hof | gf_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 | ||
| - | < | + | |
| ### 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. | + | Dieses Problem kann man unterschiedlich lösen. |
| 1. **Zwei separate Variablen**: | 1. **Zwei separate Variablen**: | ||
| Zeile 24: | Zeile 24: | ||
| 3. Das Zwischenresultat wird **fortlaufend mit 2 multipliziert**. | 3. Das Zwischenresultat wird **fortlaufend mit 2 multipliziert**. | ||
| - | < | + | < |
| <script type=" | <script type=" | ||
| def binary_to_decimal(b): | def binary_to_decimal(b): | ||
| Zeile 46: | Zeile 46: | ||
| print(binary_to_decimal(" | print(binary_to_decimal(" | ||
| </ | </ | ||
| - | </ | + | </ |
| Zeile 53: | Zeile 53: | ||
| Der {{gf_informatik: | Der {{gf_informatik: | ||
| - | < | + | < |
| <script type=" | <script type=" | ||
| def decimal_to_binary(d): | def decimal_to_binary(d): | ||
| Zeile 75: | Zeile 75: | ||
| print(decimal_to_binary(42)) | print(decimal_to_binary(42)) | ||
| </ | </ | ||
| - | </ | + | </ |
| ### Binär-Addition | ### Binär-Addition | ||
| + | |||
| + | Die Addition von Binärzahlen erfolgt wie die schriftliche Addition von Dezimalzahlen: | ||
| + | |||
| + | {{.: | ||
| + | |||
| Umsetzungsidee: | Umsetzungsidee: | ||
| * Beide Strings paarweise [[gf_informatik: | * Beide Strings paarweise [[gf_informatik: | ||
| * 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 `' | ||
| * 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 ...? | ||
| - | < | + | < |
| <script type=" | <script type=" | ||
| def binary_add(a, | def binary_add(a, | ||
| Zeile 94: | Zeile 99: | ||
| # 3) An jeder Stelle: Resultat und Übertrag berechnen. | # 3) An jeder Stelle: Resultat und Übertrag berechnen. | ||
| - | print(binary_add(" | + | print(binary_add(" |
| </ | </ | ||
| <script type=" | <script type=" | ||
| 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(" | print(binary_add(" | ||
| </ | </ | ||
| - | </ | + | </ |
| ### Binär-Subtraktion | ### Binär-Subtraktion | ||
| + | Für die Subtraktion im Binärsystem wird das {{gf_informatik: | ||
| - | <nodisp | + | 1. Auffüllen mit Nullen auf die gewünschte Anzahl Bits |
| - | ++++Lösung| | + | 2. Invertieren |
| - | <html><bottom-editor session="page"> | + | 3. `" |
| + | |||
| + | Der Code aus der vorherigen Aufgabe wird für die Addition benötigt. | ||
| + | |||
| + | <bottom-exercise id=" | ||
| + | <script type=" | ||
| + | def invert(b): | ||
| + | """ | ||
| + | |||
| + | def zweierkomplement(b, | ||
| + | """ | ||
| + | # 1) Auffüllen auf stellen bits | ||
| + | # 2) Invertieren (1->0, 0->1) | ||
| + | # 3) Addiere 1 | ||
| + | |||
| + | def binary_subtraction(a, | ||
| + | """ | ||
| + | |||
| + | print(binary_subtraction(" | ||
| + | </script> | ||
| + | <script type=" | ||
| + | assert binary_subtraction(" | ||
| + | </script> | ||
| + | <script type=" | ||
| + | def fill_zeros(b, | ||
| + | """ | ||
| + | while len(b) < digits: | ||
| + | b = " | ||
| + | return b | ||
| + | |||
| + | def binary_add(a, | ||
| + | """ | ||
| + | n = max(len(a), len(b)) | ||
| + | a = fill_zeros(a, | ||
| + | b = fill_zeros(b, | ||
| + | |||
| + | 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): | ||
| """ | """ | ||
| Zeile 168: | Zeile 226: | ||
| result = result[-stellen: | result = result[-stellen: | ||
| return result | return result | ||
| - | </ | + | </ |
| - | ++++ | + | </ |
| - | </ | + | |
| ### 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: | ||
| - | < | + | < |
| 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" | print(f" | ||
| - | </ | + | </ |
| Resultat: | Resultat: | ||