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-25 07:52] – [Code binäre Subtraktion] sca | gf_informatik:zahlensysteme [2023-06-06 21:30] (aktuell) – [Lösungen] sca | ||
---|---|---|---|
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 37: | Zeile 38: | ||
==== Zusätzliche Infos ==== | ==== Zusätzliche Infos ==== | ||
- | === Beispiel binäre | + | ==== Erklärung negative Binärzahlen & Subtraktion |
- | Wir wollen berechnen 1101001 | + | === Negative Zahlen & 2er-Komplement === |
+ | |||
+ | Computer arbeiten immer mit fixen Bitlängen. Zum Beispiel sind moderne Computer 64-Bit Computer. Das heisst, sie rechnen intern immer mit Zahlen | ||
+ | |||
+ | Möchte ein solcher Computer die Dezimalzahl 42 speichern, so speichert er die Binärzahl $0010\, | ||
+ | dass die beiden Nullen links eigentlich unnötig sind, aber es müssen immer alle Bits gesetzt sein. Ein solcher Computer kann insgesamt $2^8 = 256$ verschiedene Zahlen darstellen. Wenn man einen Computer hat, der nur mit positiven ganzen Zahlen rechnen soll, ist die kleinste Zahl $0000\,0000 = 0$ und die grösste $1111\,1111 = 255_{10}$. Wenn man aber einen Computer haben möchte, der sowohl positive | ||
+ | |||
+ | Es wird dann so gemacht, dass positive Zahlen | ||
+ | |||
+ | Doch welcher Dezimalzahl entspricht $1010\, | ||
+ | $$0010\, | ||
+ | |||
+ | Stattdessen geht man wie folgt vor, um von einer Zahl (z.B. $42_{10} = 10\,1010$) die Gegenzahl ($-42_{10} = ???$) zu finden: | ||
+ | |||
+ | 1. **Bits hinzufügen: | ||
+ | $$0010\, | ||
+ | 1. **Invertieren: | ||
+ | $$1101\, | ||
+ | 1. **Eins Addieren:** Rechne $+1$: | ||
+ | $$1101\, | ||
+ | |||
+ | Dementsprechend gilt also $-42_{10} = 1101\, | ||
+ | |||
+ | === Subraktion === | ||
+ | |||
+ | **Beispiel 1:** Wir wollen in $8$-Bit die folgende Subtraktion durchführen: | ||
+ | $$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. | ||
- | | + | |
- | | + | 1. Addiere Minuend |
- | | + | 1. Beachte, dass wir ein $9.$ Bit aufgelesen haben. Ein $8-$Bit Computer kann dieses aber gar nicht erst speichern und es geht einfach verloren, also ist das Resultat: |
- | | + | $$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 | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | Also notieren also beide Zahlen als $6-$Bit Zahlen: | ||
+ | $$01\, | ||
+ | Jetzt können wir vorgehen wie in Beispiel 1: | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | $$01\,1011 - 00\,0101 = ?$$ | ||
Zeile 57: | Zeile 99: | ||
===== Lösungen ===== | ===== Lösungen ===== | ||
- | |||
- | <nodisp 1> | ||
++++Binary to Decimal| | ++++Binary to Decimal| | ||
Zeile 105: | Zeile 145: | ||
++++ | ++++ | ||
- | ++++Binary | + | ++++Binary |
<code python> | <code python> | ||
- | import random | ||
def binary_add(b1, | def binary_add(b1, | ||
- | # make sure strings have identical | + | |
+ | b2 = b2.replace(" | ||
+ | | ||
while len(b1) < len(b2): | while len(b1) < len(b2): | ||
b1 = ' | b1 = ' | ||
while len(b1) > len(b2): | while len(b1) > len(b2): | ||
b2 = ' | b2 = ' | ||
- | | + | |
# add binary string | # add binary string | ||
summe = '' | summe = '' | ||
Zeile 138: | Zeile 179: | ||
summe = ' | summe = ' | ||
return summe | return summe | ||
+ | |||
+ | def invert(b): | ||
+ | b = b.replace(" | ||
+ | inv = "" | ||
+ | i = 0 | ||
+ | while i < len(b): | ||
+ | if b[i] == ' | ||
+ | inv = inv + ' | ||
+ | else: | ||
+ | inv = inv + ' | ||
+ | i = i + 1 | ||
+ | return inv | ||
+ | |||
+ | def complement(b): | ||
+ | b = b.replace(" | ||
+ | b = invert(b) | ||
+ | b = binary_add(b,' | ||
+ | return b | ||
+ | |||
+ | def binary_sub(b1, | ||
+ | b1 = b1.replace(" | ||
+ | b2 = b2.replace(" | ||
+ | # make sure strings have same length | ||
+ | while len(b1) < len(b2): | ||
+ | b1 = ' | ||
+ | while len(b1) > len(b2): | ||
+ | b2 = ' | ||
+ | |||
+ | # add additional zero at left (to distinguish between positive and negative numbers) | ||
+ | b1 = ' | ||
+ | b2 = ' | ||
+ | |||
+ | result = binary_add(b1, | ||
+ | result = result[1:] # remove first bit | ||
+ | | ||
+ | while len(result) > 1 and result[0] == ' | ||
+ | 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 | ||
</ | </ | ||
++++ | ++++ | ||
- | </ | ||
Zeile 257: | Zeile 352: | ||
</ | </ | ||
++++ | ++++ | ||
+ | |||
+ | ++++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(" | ||
+ | </ | ||
+ | ++++ | ||
+ | |||
+ | |||
</ | </ | ||