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 [2023-05-27 12:01] – [Subraktion] sca | gf_informatik:zahlensysteme [2025-06-24 06:59] (aktuell) – [Lösungen] sca | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Zahlensysteme ====== | ====== Zahlensysteme ====== | ||
- | Dossier: | + | **{{ : |
++++ Lernziele| | ++++ Lernziele| | ||
Zeile 25: | Zeile 25: | ||
* binär multiplizieren | * binär multiplizieren | ||
* direkt Umrechnen binär <-> hexadezimal | * direkt Umrechnen binär <-> hexadezimal | ||
+ | * umrechnen: hexadezimal <-> dezimal | ||
**Code:** | **Code:** | ||
Zeile 62: | Zeile 63: | ||
Dementsprechend gilt also $-42_{10} = 1101\, | Dementsprechend gilt also $-42_{10} = 1101\, | ||
- | === Subraktion | + | === Subtraktion |
- | Beispiel: Wir wollen in $8$-Bit die folgende Subtraktion durchführen: | + | **Beispiel |
- | $$0110\, | + | $$0110\, |
Bei der Subtraktion wird die erste Zahl Minuend, die Zweite Subtrahend genannt. | Bei der Subtraktion wird die erste Zahl Minuend, die Zweite Subtrahend genannt. | ||
Zeile 73: | Zeile 74: | ||
$$0110\, | $$0110\, | ||
+ | **Beispiel 2:** Wir wollen berechnen: $$1\,1011 - 101 = ?$$ | ||
+ | Beachte, dass hier *keine* Angaben bzgl. Anzahl Bits gemacht werden. Wir fassen deshalb beide Zahlen ($1\,1011$ und $101$) als *positive* Zahlen, auch wenn die Bits ganz links eine $1$ sind. Deshalb müssen wir die beiden Zahlen so erweitern, dass: | ||
- | === Beispiel binäre Subtraktion === | + | 1. beide gleich lang sind |
+ | 1. beide links (mind.) eine $0$ haben | ||
- | Wir wollen berechnen 1101001 - 11101, wobei beide Zahlen als positive | + | Also notieren also beide Zahlen als $6-$Bit |
- | Bei der Subtraktion wird die erste Zahl Minuend, die Zweite Subtrahend genannt. | + | $$01\,1011 - 00\,0101 = ?$$ |
+ | Jetzt können wir vorgehen wie in Beispiel 1: | ||
- | | + | |
- | 1. Füge links ein zusäzliches Bit hinzu, damit wir auch negative Zahlen haben können: 01101001 - 00011101 | + | |
- | 1. Finde 2er-Komplement | + | |
- | | + | |
- | | + | $$01\,1011 - 00\,0101 = ?$$ |
Zeile 94: | Zeile 99: | ||
===== Lösungen ===== | ===== Lösungen ===== | ||
- | |||
- | <nodisp 1> | ||
++++Binary to Decimal| | ++++Binary to Decimal| | ||
- | Verschiedene Versionen: | + | Nehmen wir `b = ' |
+ | ``` | ||
+ | Ziffer: | ||
+ | Position: 012345 | ||
+ | ``` | ||
+ | Um die Binärzahl in eine Dezimalzahl umzurechnen, | ||
+ | $$1 \cdot 2^\color{red}{5} + 0 \cdot 2^\color{red}{4} + 0 \cdot 2^\color{red}{3} + 1 \cdot 2^\color{red}{2} + 0 \cdot 2^\color{red}{1} + 1 \cdot 2^\color{red}{0}$$ | ||
+ | |||
+ | Zu jeder Ziffer gehört also die passende Potenz: | ||
+ | ``` | ||
+ | Ziffer: | ||
+ | Position: 012345 | ||
+ | Potenz: | ||
+ | ``` | ||
+ | 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. Man macht **zwei separate Variablen**: | ||
+ | 2. Man **dreht den Binärstring um**, also aus `' | ||
+ | |||
+ | Hier einige mögliche Lösungen für den ersten Ansatz: | ||
<code python> | <code python> | ||
- | def binary_to_decimal_1(b): | + | def binary_to_decimal_1a(b): |
- | | + | |
- | | + | Löse mit zwei Variablen: |
- | | + | - Variable i (der for-Schleife) zählt alle Positionen durch |
- | | + | - Variable exponent legt Exponenten fest und zählt herunter |
- | | + | """ |
- | return | + | dec = 0 # Dezimalzahl |
+ | | ||
+ | | ||
+ | | ||
+ | dec = dec + 2**exponent | ||
+ | | ||
+ | return | ||
- | def binary_to_decimal_2(b): | + | print(binary_to_decimal_1a(' |
- | d = 0 # decimal nr | + | |
- | i = 0 | + | |
- | while i < len(b): | + | |
- | d = d + int(b[-i-1]) * 2**i # can also use negative indices to go through d in reverse order | + | |
- | i = i + 1 | + | |
- | return d | + | |
- | def binary_to_decimal_3(b): | + | def binary_to_decimal_1b(b): |
- | | + | |
- | | + | Wie Varianbte 1a, nur gehen wir mit for-Schleife direkt die Elemente des Binärstrings durch (ohne Position) |
- | | + | """ |
- | | + | dec = 0 # Dezimalzahl |
- | | + | |
- | | + | |
- | i = i - 1 | + | if nr == ' |
- | return | + | dec = dec + 2**exponent |
+ | exponent = exponent - 1 | ||
+ | | ||
+ | |||
+ | print(binary_to_decimal_1b(' | ||
+ | |||
+ | def binary_to_decimal_1c(b): | ||
+ | """ | ||
+ | Wie Varianbte 1b, nur ohne if. Dafür wandeln wir die Elemente des Binärstrings in eine Zahl um. | ||
+ | """ | ||
+ | dec = 0 # Dezimalzahl | ||
+ | exponent = len(b) - 1 # Exponent Startwert | ||
+ | for nr in b: # Schleife über Position | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | print(binary_to_decimal_1c(' | ||
+ | |||
+ | def binary_to_decimal_1d(b): | ||
+ | """ | ||
+ | Wie Varianbte 1a, nur wird exponent direkt aus i berechnet und muss dadurch nicht in jedem Schritt der Schleife um 1 reduziert werden. | ||
+ | """ | ||
+ | dec = 0 # Dezimalzahl | ||
+ | for i in range(len(b)): | ||
+ | exponent = len(b) - i - 1 # Berechnung Exponent | ||
+ | if b[i] == ' | ||
+ | dec = dec + 2**exponent | ||
+ | return | ||
+ | |||
+ | print(binary_to_decimal_1d(' | ||
</ | </ | ||
+ | |||
++++ | ++++ | ||
Zeile 145: | Zeile 201: | ||
<code python> | <code python> | ||
+ | |||
def binary_add(b1, | def binary_add(b1, | ||
+ | b1 = b1.replace(" | ||
+ | b2 = b2.replace(" | ||
# make sure strings have same length | # make sure strings have same length | ||
while len(b1) < len(b2): | while len(b1) < len(b2): | ||
Zeile 173: | Zeile 232: | ||
summe = ' | summe = ' | ||
return summe | return summe | ||
+ | |||
def invert(b): | def invert(b): | ||
+ | b = b.replace(" | ||
inv = "" | inv = "" | ||
i = 0 | i = 0 | ||
Zeile 184: | Zeile 244: | ||
i = i + 1 | i = i + 1 | ||
return inv | return inv | ||
+ | |||
def complement(b): | def complement(b): | ||
+ | b = b.replace(" | ||
b = invert(b) | b = invert(b) | ||
b = binary_add(b,' | b = binary_add(b,' | ||
return b | return b | ||
+ | |||
def binary_sub(b1, | def binary_sub(b1, | ||
+ | b1 = b1.replace(" | ||
+ | b2 = b2.replace(" | ||
# make sure strings have same length | # make sure strings have same length | ||
while len(b1) < len(b2): | while len(b1) < len(b2): | ||
Zeile 196: | Zeile 259: | ||
while len(b1) > len(b2): | while len(b1) > len(b2): | ||
b2 = ' | b2 = ' | ||
- | | + | |
- | # add additinal | + | # add additional |
b1 = ' | b1 = ' | ||
b2 = ' | b2 = ' | ||
- | | + | |
result = binary_add(b1, | result = binary_add(b1, | ||
result = result[1:] # remove first bit | result = result[1:] # remove first bit | ||
| | ||
- | while result[0] == ' | + | while len(result) > 1 and result[0] == ' |
result = result[1:] | result = result[1:] | ||
+ | return result | ||
+ | |||
+ | def binary_mul(b1, | ||
+ | b1 = b1.replace(" | ||
+ | b2 = b2.replace(" | ||
+ | result = "" | ||
+ | | ||
+ | i = len(b1) - 1 | ||
+ | while i >= 0: | ||
+ | if b1[i] == ' | ||
+ | result = binary_add(result, | ||
+ | b2 = b2 + ' | ||
+ | i = i - 1 | ||
+ | | ||
+ | while len(result) > 1 and result[0] == ' | ||
+ | result = result[1:] | ||
+ | |||
return result | return result | ||
</ | </ | ||
Zeile 211: | Zeile 291: | ||
++++ | ++++ | ||
- | </ | ||
Zeile 326: | Zeile 405: | ||
</ | </ | ||
++++ | ++++ | ||
+ | |||
+ | ++++Function Testing| | ||
+ | |||
+ | <code python> | ||
+ | ### FUNCTION TESTING CODE | ||
+ | for i in range(1000): | ||
+ | da = random.randint(0, | ||
+ | db = random.randint(0, | ||
+ | if db > da: da,db = db,da | ||
+ | a = bin(da)[2:] | ||
+ | b = bin(db)[2:] | ||
+ | if not a == invert(invert(a)): | ||
+ | print(" | ||
+ | | ||
+ | if not binary_add(a, | ||
+ | print(" | ||
+ | | ||
+ | if not binary_sub(a, | ||
+ | print(" | ||
+ | </ | ||
+ | ++++ | ||
+ | |||
+ | ++++Exercise Generator| | ||
+ | <code python> | ||
+ | ### EXERCISE GENERATOR | ||
+ | for i in range(3): | ||
+ | da = random.randint(128, | ||
+ | db = random.randint(128, | ||
+ | if db > da: da,db = db,da | ||
+ | a = bin(da)[2:] | ||
+ | b = bin(db)[2: | ||
+ | print(" | ||
+ | print(" | ||
+ | |||
+ | for i in range(3): | ||
+ | da = random.randint(128, | ||
+ | a = bin(da)[2:] | ||
+ | print(" | ||
+ | print(" | ||
+ | |||
+ | for i in range(3): | ||
+ | da = random.randint(128, | ||
+ | db = random.randint(128, | ||
+ | if db > da: da,db = db,da | ||
+ | a = bin(da)[2:] | ||
+ | b = bin(db)[2: | ||
+ | print(" | ||
+ | print(" | ||
+ | |||
+ | for i in range(3): | ||
+ | da = random.randint(1, | ||
+ | db = random.randint(1, | ||
+ | if db > da: da,db = db,da | ||
+ | a = bin(da)[2:] | ||
+ | b = bin(db)[2:] | ||
+ | while len(a) < 4: a = ' | ||
+ | while len(b) < 4: b = ' | ||
+ | print(" | ||
+ | print(" | ||
+ | </ | ||
+ | ++++ | ||
+ | |||
+ | |||
</ | </ | ||