====== Zahlensysteme ====== Du zählst und rechnest gewöhnlich im //Dezimalsystem// (Zehnersystem): Du kennst die //zehn// Ziffern 0 bis 9 – und du weisst, dass bei mehrstelligen Zahlen jede zusätzliche Stelle von rechts nach links //zehn// mal mehr wert ist: Die Zahl 234 setzt sich zusammen aus 2 mal **100** plus 3 mal **10** plus 4 mal **1**. Hier betrachten wir //andere Zahlensysteme//, insbesondere das **Binärsystem** und das **Hexadezimalsystem**. ++++Lernziele:| * Ich kann die Begriffe //Nennwert, Wertigkeit, Basis, Ziffer/Stelle, Binärzahl, Binärstring, Bit, Byte// mit Beispielen erklären. * Ich kann Zahlen aus Stellenwertsystemen mit beliebiger Basis in das Dezimalsystem schriftlich (von Hand) umrechnen. * Ich kann den Restwert-Algorithmus anwenden, um Dezimalzahlen in Binärzahlen oder in Hexadezimalzahlen umzurechnen. * Ich kann in Pyhton //Funktionen// (mit und ohne //Argumente//, mit und ohne //Rückgabewerte//) //definieren// und //aufrufen//. * Ich kann jeden //Begriff// des vorhergehenden Satzes erklären. * Ich kann in Python Binärstrings analysieren und sie in Dezimalzahlen umwandeln. * Ich kann den Restwert-Algorithmus in Python programmieren, um Dezimalzahlen in Binärstrings zu wandeln. * Ich kann die Funktionen ''str()'', ''int()'' und ''len()'' korrekt verwenden und erklären, was sie tun. * Ich kann zwei Binärzahlen schriftlich addieren. * Ich kann Hexadezimalzahlen in Binärzahlen umwandeln und umgekehrt. * Ich kann die den Hex-Nennwerten 0...F entsprechenden Dezimalwerte nennen. * Ich kann erklären, wei RGB-Hex-Codes aufgebaut sind und von einem RGB-Hex-Code ungefähr auf die entsprechende Farbe schliessen. ++++ ===== - Einführung, verschiedene Zahlensysteme ===== Neben dem Zehnersystem könnten wir auch in Stellenwertsystemen mit anderer Basis zählen und rechnen – zum Beispiel im [[https://de.wikipedia.org/wiki/Oktalsystem|Oktalsystem]] mit Basis 8 oder im [[https://de.wikipedia.org/wiki/Vigesimalsystem|Vigesimalsystem]] mit der Basis 20. Das **Binärsytem** (Basis 2) und das **Hexadezimalsystem** (Basis 16) sind in der Informatik von besonderer Bedeutung: * Computer und andere digitale Geräte kennen nur die Zustände 0 und 1. Sie rechnen im **Binärsytem**, in dem alle Zahlen mit diesen zwei Ziffern, 0 und 1, dargestellt und berechnet werden können. * Das **Hexadezimalsystem** besteht aus den Ziffern 0 bis 9 und zusätzlich aus den Ziffern A...F, hat also 16 Ziffern (von griech. hexa „sechs“ und lat. decem „zehn“). Wozu ist das gut? Die Antwort: Für Menschen, die mit Computern arbeiten: * Jede //vierstellige// Binärzahl lässt sich durch //eine einzige// Ziffer im Hexadezimalsystem darstellen: * Die grösste vierstellige Binärzahl ''1111'' passt genau in die grösste einstellige Hexadezimalzahl ''F'' (weil 16 ist eine 2er-Potenz ist: 24 = 16). * Das heisst: Im Hexadezimalsystem können Binärzahlen sehr kompakt und für Menschen gut lesbar dargestellt werden. Wir arbeiten vorwiegend mit dem {{ :gf_informatik:gfif_zahlensysteme_dossier.pdf |Dossier Zahlensysteme}}. === Auftrag 1 – Einführung ins Dossier Zahlensysteme === - Lies {{ :gf_informatik:gfif_zahlensysteme_dossier.pdf#section.1|Kapitel 1}} im Dossier und beantworte die Fragen zum Zählen mit den Fingern: - Wie weit zählst du gewöhnlich mit Fingern? - Zusatzaufgabe (freiwillig): Wie weit kannst du im Binärsystem mit den Fingern einer Hand oder zweier Hände zählen? === Auftrag 2 – Verschiedene Zahlensysteme === - Lies {{ :gf_informatik:gfif_zahlensysteme_dossier.pdf#section.2|Kapitel 2}} im Dossier und löse Aufgabe A1. Vergleiche anschliessend mit der Lösung am Ende des Dossiers. - Zusatzaufgabe: Wie gross ist die Zahl 2347 im uns bekannten Dezimalsystem? ++++ Tipps für die Zusatzaufgabe:| * Beschrifte erst jede Ziffer mit ihrer Wertigkeit. Für das Septenärsystem (Siebnersystem) ist das von rechts nach links: 70, dann 71, dann 72... * Multipliziere für jede Ziffer den Nennwert mit der Wertigkeit und zähle die Resultate zusammen. ++++ ===== - Binärsystem ===== === Auftrag 3 – Binärzahlen lesen und umwandeln === - Lies {{ :gf_informatik:gfif_zahlensysteme_dossier.pdf#section.3|Kapitel 3}} im Dossier und löse Aufgaben B1 und B2. - Löse Aufgabe B3 im Dossier auf [[https://webtigerpython.ethz.ch/]]: - Definiere eine Funktion ''binary\_to\_decimal(b)'', die den //Binärstring// ''b'' in eine Dezimalzahl wandelt und diese zurückgibt. Beachte hierfür folgende Hinweise in den grünen Boxen. Notiere zuerst mit Kommentaren, wie du die Funktion aufbauen willst. - Teste deine Funktion. * Für diese Übungen stellen wir **Binärzahlen als String** (als Text) dar: Der **Binärstring** ''"101"'' entspricht der Dezimalzahl ''5''. * Einen String können wir **mit einer Schleife** (while oder for) Buchstabe für Buchstabe durchgehen. * Mit ''[''eckigen Klammern'']'' kannst auf einzelne Positionen im String zugreifen: Für ''text = "Hallo Welt"'' gibt ''text[4]'' das Zeichen ''"o"''. * Die **Wertigkeit** jeder Stelle in einer Binärzahl ist ''2Stelle'' (in python: ''2 \** stelle''): * Die Stelle ganz rechts ist die nullte Stelle, die links davon ist Stelle 1, dann 2 etc. * Beispiel 1: Für die dreistellige Binärzahl ''111'' rechnen wir 22 + 21 + 20 = 4 + 2 + 1 = **7**. * Beispiel 2: Für die vierstellige Binärzahl ''1001'' rechnen wir 23 + 20 = 8 + 1 = **9**. * Wenn du mit einer Schleife einen String durchgehst, beginnst du gewöhnlich bei der Stelle //ganz links//. Dann hat die //erste// Stelle im Binärstring ''"10110"'' die Wertigkeit 24, also 16. Die nächste Stelle hat die Wertigkeit 8, dann 4 etc. Der Binärstring ''"10110"'' entspricht also der Dezimalzahl 22 (16 + 4 + 2). * Die Funktion ''int'' wandelt ein Zeichen in die entsprechende Zahl, z. B. ''int('1') = 1''. === Auftrag 4 – Bits und Bytes === - Löse {{ :gf_informatik:gfif_zahlensysteme_dossier.pdf#page.7|Aufgabe B4}} im Dossier. === Auftrag 5 – Dezimalzahlen in Binärzahlen umwandeln === - Lies {{ :gf_informatik:gfif_zahlensysteme_dossier.pdf#page.8|Seite 8}} im Dossier und löse die Aufgabe B5. - Löse die Aufgabe B6: Schreibe eine Funktion ''decimal\_to\_binary(d)'', die die Dezimalzahl ''d'' in einen Binärstring umrechnet und diesen zurückgibt. === Auftrag 6 – Binäre Addition === - Löse die Aufgabe B7 auf {{ :gf_informatik:gfif_zahlensysteme_dossier.pdf#page.11|Seite 11}}. - Löse die Aufgabe B8 Schreibe eine Funktion ''binary\_add(a, b)'', die zwei //gleich lange// Binästrings ''a'' und ''b'' addiert und die Summe als Binärstring zurückgibt. - Die Addition soll nach demselben Verfahren verfolgen, das du in der schriftlichen Addtion anwendest. Eine Umwandlung in Dezimalzahlen ist nicht erlaubt. - Beachte die Tipps im Dossier und folgenden Hinweise: Wir können Aufgabe mithilfe der Operatoren ''Modulo'' und ''Ganzzahldivision'' lösen. Kopiere den Code unten und notiere erst mit ''#Kommentaren'' hinter jede Zeile, welche beiden Zahlen ausgegeben werden. Führe dann aus. - Deine Funktion muss (unter anderem) ''a'' und ''b'' Bit für Bit mit dem (bestehenden) Rest zusammenrechnen, um erstens die Summe für das aktuelle Bit und zweitens den Rest für das nächste Bit zu erhalten. - Notiere erst mit Kommentaren, wie du die Funktion aufbauen willst. - Wenn deine Funktion funktioniert: Erweitere sie so, dass auch zwei unterschieldich lange Binärstrings miteinander addiert werden können. print(3%2, 3//2) print(2%2, 2//2) print(1%2, 1//2) print(0%2, 0//2) === Auftrag 7 – Binäre Addition ohne Software (optional) === {{:gf_informatik:zahlensysteme_gra:pasted:20250627-115012.png?400}} Du weisst, dass Computer und andere digitale Geräte **Rechenmaschinen** sind: Sie können **unfassbar schnell** rechnen. **Aber wie**? Die Einsen und Nullen speichert der Computer in Form elektrischer Ladungen – vereinfacht betrachtet: Ist in einer Speicherzelle eine Ladung, so bedeutet das eine Eins, sonst eine Null. Nehmen wir 8 Speicherzellen zusammen, so können wir darin eine 8-Bit-Binärzahl speichern. Angenommen, wir haben 8 Speicherzellen für Zahl A und weitere 8 Speicherzellen für Zahl B: **Eine digitale Addiermaschine muss nun die Speicherzellen der Zahlen A und B so miteinander verbinden, dass sich daraus die Summe von A und B ergibt.** - Lies Teil 3 im Skript {{ :talit:electronics:transistorcpu_skript_complete.pdf#page.8|Vom Transistor zur CPU}}: Du musst nicht alles verstehen: Betrachte den Transitor einfach als Schalter, der elektrisch aktiviert wird. Wichtig ist, dass du die **Logikgatter** (engl. //Logic gates//) AND, OR, und XOR verstehst. Aus diesen Bausteinen werden nicht nur Rechenschaltungen, sondern auch andere essentielle Bestandteile eines Computers wie Speicher, Zähler, Register etc. gebaut. Bei Unklarheiten LP fragen. - Lies nun das Kapitel **Binäre Addition** im Teil 7 des Skripts. - [[https://youtu.be/wvJc9CZcvBc?si=LF4-FYZycmZSFWmX|Dieses Video]] erklärt den Aufbau von digitalen Addierschaltungen Schritt für Schritt. - Testfrage: Angenommen, ein Logikgatter ist aus durchschnittlich 10 Transistoren aufgebaut: Wie viele Transistoren sind nötig, um zwei 8-Bit-Zahlen zu addieren? - Baue selbst eine kleine Schaltung mit fertigen **4-Bit-Additions-Bausteinen** auf und probiere sie aus: - Löse erst Aufgabe 1 in {{ :talit:breaboard-schaltungen.pdf | Einfache Schhaltungen auf dem Breadboard aufbauen }}: Damit du lernst, wie man Schaltungen auf dem Breadboard aufbaut. - Studiere das Datenblatt des [[https://www.ti.com/lit/ds/symlink/sn54ls283.pdf?ts=1751002842529&ref_url=https%253A%252F%252Fwww.mouser.com%252F|4-Bit-Voll-Addierer-Chips 74LS283]] - VCC verbindest du mit dem Pluspol der Spannungsquelle (5V), GND mit dem Minuspol. - GND Eingänge auf Schalter. - Die Eingänge A und B verbindest du erstens über 10kΩ-Pullup-Widerstände mit 5V, zweitens über Schalter mit GND. - Die Ausgänge Σ verbindest du über 150Ω-Widerstände mit den Anoden von LEDs, deren Kathoden dann auf GND gehen. - Frage die LP nach dem Material. ===== - Hexadezimalsystem ===== ^ Wert Dezimal ^ Wert Binär ^ Hex-Nennwert ^ Merkhilfe ^ | 0 | ''0000'' ^ 0 | | | 1 | ''0001'' ^ 1 | | | ... | ... ^ ... | | | 9 | ''1001'' ^ 9 | | | 10 | ''1010'' ^ A | | | 11 | ''1011'' ^ B | | | 12 | ''1100'' ^ C | **C**wölf | | 13 | ''1101'' ^ D | **D**reizehn | | 14 | ''1110'' ^ E | | | 15 | ''1111'' ^ F | **F**ünfzehn | === Auftrag 8 – Umwandlungen Hex, Dez, Bin === - Löse {{ :gf_informatik:gfif_zahlensysteme_dossier.pdf#page.22|Aufgabe C1}} im Dossier. - Gehe gleich vor, wie bei der Umwandlung von Binär zu Dezimal. Nur ist die Basis nun 16. Die Stelle ganz rechts hat die Wertigkeit 160, die links davon 161, dann 162 etc. Die Nennwerte entsprechen der Tabelle oben. - Bei der Umwandlung von Dezimal zu Hex kannst du wieder den Restwert-Algorithmus anwenden – angepasst für das Hexadezimalsystem - Lies {{ :gf_informatik:gfif_zahlensysteme_dossier.pdf#page.23|Seite 23}} im Dossier und folgende Überlegung: Wie du in der Tabelle oben siehst, füllen vier Binär-Stellen genau eine Hex-Stelle aus: - Für die Umwandlung von **Binär nach Hex** musst du einfach jeweils vier Binär-Stellen (von rechts) zusammennehmen und die entsprechende Hex-Ziffer notieren. - Für die Umwandlung von **Hex nach Binär** machst du das Gegenteil: Für jede Hexziffer vier Binärstellen hinschreiben. - Löse {{ :gf_informatik:gfif_zahlensysteme_dossier.pdf#page.24|Aufgabe C2}} im Dossier. === Auftrag 9 – RGB-Hexcodes === Alle Farben können durch Mischen der Grundfarben Rot, Grün, und Blau erzeugt werden. Auf deinem Display, das du jetzt gerade ansiehst (auch Bildschirm genannt), werden diese drei Farben wie folgt gemischt: Jedes Pixel deines Displays besteht aus einem roten, grünen und blauen Feld. Jedes dieser Felder kann **unterschiedlich hell** leuchten: Jedes Pixel besteht aus einem roten, grünen und blauen Leuchtefeld: {{.:zahlensysteme_gra:pasted:20250630-150736.png?250}} Hier sind 9 x 6 Pixel zu sehen: \\ {{.:zahlensysteme_gra:pasted:20250630-134826.png?250|}} Jedes Feld kann unterschiedlich hell leuchten: {{.:zahlensysteme_gra:pasted:20250630-150601.png?200}} * Beispiel: Wenn das rote und das blaue Feld ganz hell leuchten und das grüne gar nicht leuchtet, dann leuchtet dieses Pixel pink. Dein Computer speichert also für jedes Pixel drei Farbwerte. Die drei Werte geben an, wie **hell** das jeweilige Feld leuchten soll. Normalerweise wird für jede Farbe **1 Byte** (= 8 Bit) reserviert. Das heisst, für jede Farbe können **28 verschiedene Helligkeitsstufen** definiert werden: 0 = dunkel, 255 = maximal hell. **Was hat das alles mit Hex zu tun?** Im Hexadezimalsystem kann 1 Byte mit genau 2 Ziffern dargestellt werden. Um jede beliebige Farbe anzugeben, benötige ich also bloss 2 Ziffern pro Grundfarbe, also 6 Ziffern. Hier ein paar Beispiele: * Der Code **0xFF0000** beschreibt die Farbe (reines) Rot: voll rot, kein grün, kein blau. * Der Code **0xFF7C00** beschreibt die Farbe Orange: voll rot, halb grün und kein blau. * Der Code **0x9437FF** beschreibt dieses Violett: viel rot, wenig grün und voll blau. Alles klar? Falls ja: Bearbeite folgende Aufgaben. Falls nein: LP fragen. == A – Wie viele Farben? == Wenn jede Farbe eine Pixels in 256 verschiedenen Helligkeitsttufen leuchten kann: Wie viele Farben können dargestellt werden? Rechne und vergleiche dann mit der Lösung unten. ++++ Lösung:| **16.7 Millionen** (genau 16'777'216) **Farben**. ++++ == B – RGB-Werte in Word == Experimentiere mit Word (oder mit einem ähnlichen Programm): - Schreibe einen Text, markiere ihn und klicke auf die Schaltfläche für die Textfarbe. - Klicke auf "weitere Farben". Du solltest zu einem Menü gelangen, bei dem du die drei Grundfarben mit Reglern oder direkt durch Eingabe von Werten verstellen kannst. - Verstelle die Werte für Rot, Grün, und Blau und beobachte die Wirkungen. == C – RGB-HexCode-Bild == Jedes gute Gestaltungsprogramm bietet die Möglichkeit, RGB-HexCodes einzugeben und auszulesen. RGB-HexCodes kannst du einfach kopieren und einfügen. Damit kannst du sicher sein, dass du //genau// die richtige Farbe wählst. Hier eine kleine Übung: Erstelle ein Bild in der Art, wie du es unten siehst: - Suche ein Bild in hoher Auflösung, das dir gefällt, aber nicht zu bunt ist: Mann soll die Texte lesen können. - Füge es in Powerpoint (o.ä.) ein, vergrössere es seitenfüllend und füge drei grosse schwarze Texte namens 0x000000 ein. - Markiere einen Text, ändere seine Farbe und wähle mit dem Pipetten-Werkzeug eine Farbe aus dem Bild. Kopiere den HexCode dieser Farbe und füge ihn in den Text ein, der nun ebenso gefärbt ist. - **Am Ende soll für alle drei Texte der Text (RGB-HexCode) mit der Textfarbe übereinstimmen.** - Exportiere das ganze als PNG-Datei. - Öffne dein PNG-Bild und überprüfe, ob die Hex-Codes mit den Farben übereinstimmen. [[https://www.w3schools.com/colors/colors_hexadecimal.asp|Hier]] kannst du RGB-HexCodes auslesen und einfügen und die entsprechende Farbe sehen. - Wenn alles stimmt: sende das Bild der Lehrperson. {{.:zahlensysteme_gra:pasted:20250627-150017.png?400}} === Auftrag 10 – Turtle-RGB-Regler (optional) === Erstelle auf webtigerpython einen einfachen Turtle-RGB-Regler: * Die Turtle zeichnet einen grossen Punkt der gewählten Farbe. * Mit den Pfeiltasten links und rechts kannst du die aktuelle Grundfarbe wählen. * Mit den Pfeiltasten auf und ab kannst du den Wert dieser Farbe erhöhen: * Für jede Grundfarbe sollen nur 6 Stufen inkl. 0 einstellbar sein, also 0, 51, 102, 153, 204, 255. * Wenn du diese Zahlen in Hex notierst und in eine Liste packst, kannst du den anzuzeigenden RGB-HexCode jederzeit leicht zusammenstellen. * Erweitere deinen Regler mit beliebigen Features. ===== - Zustazaufgaben ===== Siehe Dossier {{ :gf_informatik:gfif_zahlensysteme_dossier.pdf#section.5|Kapitel 5}}, Aufgaben D1 bis D3 ===== - Lösungen zu den Programmieraufgaben ===== === Aufgabe B3 === Code-Variante mit While-Schleife, die Bitstring von links nach rechts durchgeht. def binary_to_decimal(b): decimal = 0 stellenwert = 2**(len(b)-1) # Wert des höchstwertigen Bits berechnen i = 0 while i < len(b): if b[i] == '1': decimal = decimal + stellenwert stellenwert = stellenwert // 2 # Stellenwert halbieren für nächste Stelle i = i + 1 return decimal print(binary_to_decimal('100011')) \\ Kürzere Variante: Anstelle der if-Verzweigung können wir jeweils mit dem aktuellen Bit (0 oder 1) mutliplizieren – das Zeichen ('0' oder '1') muss hierzu mit der Funktion ''int'' in die entsprechende Zahl gewandelt werden: def binary_to_decimal(b): decimal = 0 stellenwert = 2**(len(b)-1) # Wert des höchstwertigen Bits berechnen i = 0 while i < len(b): decimal = decimal + int(b[i]) * stellenwert stellenwert = stellenwert // 2 # Stellenwert halbieren für nächste Stelle i = i + 1 return decimal print(binary_to_decimal('100011')) \\ Noch kürzere Variante: Anstatt den Stellenwert zu Beginn zu berechnen, können wir ihn in jedem Durchgang neu berechnen: Dabei rechnen wir: 2 hoch (Länge der Binärzahlzahl minus aktuelle Stelle minus 1): Also für das dritte Bit der Binärzahl 10101 rechnen wir 2 hoch (5-3-1), also 2 hoch 2 gleich 4: Das ist richtig, diese Stelle hat den Stellenwert 4. def binary_to_decimal(b): decimal = 0 i = 0 while i < len(b): decimal = decimal + int(b[i]) * 2**(len(b)-i-1) i = i + 1 return decimal print(binary_to_decimal('100011')) === Aufgabe B6 === def decimal_to_binary(d): bstring = "" while d > 0: bstring = str(d % 2) + bstring # neue Ziffer vorne am String anfügen d = d // 2 return bstring print(decimal_to_binary(27)) === Aufgabe B8 === Version //ohne// Anpassung ungleicher Längen: def binary_add(a, b): resultat = "" i = len(a) - 1 rest = 0 while i >= 0: abit, bbit = int(a[i]), int(b[i]) summe = (abit + bbit + rest) % 2 rest = (abit + bbit + rest) // 2 resultat = str(summe) + resultat i = i - 1 if rest != 0: resultat = str(rest) + resultat return resultat print(binary_add('111', '011')) # 7 + 3 print(binary_add('001', '101')) # 1 + 5 Version //mit// Anpassung ungleicher Längen: def binary_add(a, b): # Binärstrings gleich lang machen: maxlen = max(len(a), len(b)) a = a.zfill(maxlen) b = b.zfill(maxlen) resultat = "" i = maxlen - 1 rest = 0 while i >= 0: abit, bbit = int(a[i]), int(b[i]) summe = (abit + bbit + rest) % 2 rest = (abit + bbit + rest) // 2 resultat = str(summe) + resultat i = i - 1 if rest != 0: resultat = str(rest) + resultat return resultat print(binary_add('111', '11')) # 7 + 3 print(binary_add('1', '101')) # 1 + 5