Dossier: gfif_zahlensysteme_dossier.pdf
Lernziele
Prüfungsrelevant ist alles, was in den Lektionen und Übungen behandelt wurde. Die Lernziele unten dienen als Gradmesser und sind nicht unbedingt komplett.
Erklären:
Rechnen:
von Hand und direkt (also nicht z.B. vor Addition in 10er-System umrechnen):
Code:
Beispiel binäre Subtraktion
Wir wollen berechnen 1101001 - 11101, wobei beide Zahlen als positive Zahlen aufzufassen sind.
Bei der Subtraktion wird die erste Zahl Minuend, die Zweite Subtrahend genannt.
Befülle mit 0, so dass beide gleich lang: 1101001 - 0011101
Füge links ein zusäzliches Bit hinzu, damit wir auch negative Zahlen haben können: 01101001 - 00011101
Finde 2er-Komplement von Subtrahend (Invertieren, +1): 11100011
Addiere Minuend mit 2er-Komplement von Subtrahend: 01101001 + 11100011 = …
Entferne Bit ganz links, da dieses nur für die Berechnung verwendet wurde: 1001100
Tipps: Code binäre Subtraktion
Implementiere die Inversion (Umkehrung) einer Binärzahl, optimalerweise in einer eigenen Funktion.
2er-Komplement: Verwende dazu deinen Code/deine Funktion von 1. und addiere dann „1“ dazu. Dazu kannst du deine binary_add()
-Funktion von früher verwenden.
Addiere zum Minuend das 2er-Komplement des Subtrahends. Verwende dazu wieder die binary_add()
.
Binary to Decimal
Verschiedene Versionen:
def binary_to_decimal_1(b):
d = 0 # decimal nr
i = 0
while i < len(b):
d = d + int(b[len(b)-i-1]) * 2**i # len(b)-i-1 to go through b in reverse order
i = i + 1
return d
def binary_to_decimal_2(b):
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):
d = 0 # decimal nr
i = len(b) - 1
power = 1
while i >= 0:
d = d + int(b[i]) * power
power = power * 2
i = i - 1
return d
Decimal to Binary
def decimal_to_binary(d):
b = ''
while d > 0:
b = str(d % 2) + b
d = d // 2
return b
Binary Operations
def binary_add(b1,b2):
# make sure strings have same length
while len(b1) < len(b2):
b1 = '0' + b1
while len(b1) > len(b2):
b2 = '0' + b2
# add binary string
summe = ''
i = len(b1) - 1
carry = '0'
while i >= 0:
if b1[i] == '0' and b2[i] == '0' and carry == '0':
summe = '0' + summe
carry = '0'
elif b1[i] == '1' and b2[i] == '1' and carry == '1':
summe = '1' + summe
carry = '1'
elif (b1[i] == '1' and b2[i] == '1' and carry == '0') or (b1[i] == '1' and b2[i] == '0' and carry == '1') or (b1[i] == '0' and b2[i] == '1' and carry == '1'):
summe = '0' + summe
carry = '1'
else:
summe = '1' + summe
carry = '0'
i = i - 1
if carry == '1':
summe = '1' + summe
return summe
def invert(b):
inv = ""
i = 0
while i < len(b):
if b[i] == '0':
inv = inv + '1'
else:
inv = inv + '0'
i = i + 1
return inv
def complement(b):
b = invert(b)
b = binary_add(b,'1')
return b
def binary_sub(b1,b2): # calc b1-b2
# make sure strings have same length
while len(b1) < len(b2):
b1 = '0' + b1
while len(b1) > len(b2):
b2 = '0' + b2
# add additinal zero at left (for negative numbers)
b1 = '0' + b1
b2 = '0' + b2
result = binary_add(b1,complement(b2))
result = result[1:] # remove first bit
while result[0] == '0': # remove all zeros at beginning (optional)
result = result[1:]
return result