Pfad: Home ==> Kurs ==> Bin/Hex-Zahlen     This page in English (external): Flag EN
ATtiny13

Kurzeinführung in Binär- und Hexadezimalzahlen


In diesem Kurs wird oft mit binären und mit hexadezimalen Zahlen umgegangen. Diese Kurzdarstellung zeigt einige Grundlagen auf, deren Kenntnis dabei hilfreich sein könnte.
Binärzahlen Hexadezimalzahlen Werkzeuge

Binärzahlen

Bei Controllern gibt es nur Nullen und Einsen. Damit wird alles gemacht. Nicht nur reine Zahlen werden damit dargestellt, sondern einzelne Bits in Registern, I/O-Ports oder Portregistern können nur Null oder Eins sein. Irgendwas dazwischen gibt es bei Controllern sehr selten (z. B. bei Analog-Digitalwandlern wird aus einer analogen Spannung eine digitale Zahl angefertigt).

Bei Zahlensystemen basieren diese immer auf einer Grundgröße, der Basis. Im Zehnersystem ist es die zehn, im Binärsystem halt die zwei. Entsprechend gibt es im Dezimalsystem 10 verschiedene Ziffern (von 0 bis 9), im Binärsystem nur zwei (0 und 1).

Wird eine Zahl größer als mit nur einer Ziffer darstellbar ist, wird nach links hin angebaut. Zwölf sind daher eine links angebaute 1, aber mit zehn malgenommen, plus zwei. Allgemein kriegt man so jede beliebigt große Zahl in Griff. Fünfstellige Zahlen im Dezimalsystem gehen dann so:

12345 = 1 * 104 + 2 * 103 + 3 * 102 + 4 * 101 + 5 * 100

wobei jede Ziffer (ausser der Null, aber die kommt hier nicht vor) hoch 0 gleich Eins ist.

Bei Binärzahlen ist das ganz ähnlich. Hier ist dezimal 12345 in binär
11.0000.0011.1001 = 1 * 213 + 1 * 212 + 0 * 211 + 0 * 210 + 0 * 29 + 0 * 28 + 0 * 27 + 0 * 26 + 1 * 25 + 1 * 24 + 1 * 23 + 0 * 22 + 0 * 21 + 1 * 20


Das ist noch einfacher zu rechnen als Dezimal: alle Bits mit Null davor zählen nix, alle Bits mit Eins soviel wie die Zweierpotenz. Damit vereinfacht sich die Zahl zu
1 * 213 + 1 * 212 + 1 * 25 + 1 * 24 + 1 * 23 + 1 * 20


Die dezimalen Werte der Zweierpotenzen sind 1, 2, 4, 8, 16, 32, 64, 128, usw. und die müssen wir bei Einsen zusammenzählen um wieder dezimal 12345 herauszukriegen.

Es ist klar, dass große Dezimalzahlen, hier eine fünfstellige, in binär noch mehr Ziffern haben (hier: 14).

Aber Obacht: kein Mensch muss jetzt mit 40-stelligen Binärzahlen (das ist die größte, die in diesem Kurs vorkommt) umgehen und sich den Mund mit Nullen und Einsen fusselig reden, weil es auch viel einfacher geht (hexadezimal) und weil es dafür Werkzeug gibt, ohne die Zweierpotenz von 40 ausrechnen zu müssen.

Das täglich Brot von Assembler-Programmierern hört bei 8 Binärziffern schon auf, mehr passt sowieso nicht in ein AVR-Register. Daher sollte man die Zweierpotenzen bis 128 schon im Kopf haben, mehr aber braucht kein Mensch (der keine 64-Bit-CPU programmieren muss).

Im Gegenteil haben es die ganz kleinen Binärzahlen bei Controllern oft viel dicker hinter den Ohren. So reicht ein einzelnes Bit in einem Portregister dazu aus, um eine LED ein- oder auszuknipsen. Drei Bits (CS02, CS01, CS00) reichen bei einem Timer dazu aus, um aus acht verschiedenen Taktquellen des Timers auszuwählen. Und so weiter und so fort. Auch das sind gewichtige Zahlen, obwohl sie so klein sind.

Um dem Assembler mitzuteilen, dass man mit 111 keine Dezimalzahl meint sondern eine binäre, schreibt man "0b" davor, also 0b111 sind von hinten nach vorne, dezimal 1 + 2 + 4 = 7. Ein gewaltiger Unterschied zu dezimal 111.

Um dem Assembler beizubringen, dass man das linkeste Bit eines Registers (mit acht Bits) bitte schön gesetzt haben möchte, schreibt man
ldi R16,1<<7

Das ldi meint "load immediate" oder "lade Konstante in Register". Die zwei Pfeile nach links sagen, er möge eine 1 sieben Mal nach links schieben (und von rechts immer Nullen dazu schieben), und schon haben wir dezimal 128 schön unleserlich in das Register gezaubert. Und damit gleich gelernt, dass das Malnehmen mit 2 bei Assemblers einfach mit einmal Linksschieben der Bits geht.

Und um es ganz verrückt zu machen, könnten wir den Assembler dazu veranlassen die Zahl 12345 nicht nur mit ".equ Zahl = 12345", sondern auch mit
.equ Zahl = (1<<13) | (1<<12) | (1<<5) | (1<<4) | (1<<3) | (1<<0)


mit dem Namen "Zahl" in einen internen Symbolspeicher zu packen und den Wert 12345 dazu zu schreiben. Auf dass wir später im Quellcode darauf zugreifen können. Das | steht dabei für ein binäres ODER und setzt das 12345 aus den jeweils einzelnen gesetzten Einsen zusammen. Wer jetzt im Quellcode nach der Zeichenfolge "12345" sucht, der wird nicht mehr fündig werden.

Binärzahlen Hexadezimalzahlen Werkzeuge

Hexadezimalzahlen

Um die Zahlenhuberei bei Binärzahlen erheblich zu vereinfachen, werden jeweils vier Binärzahlen zu einer Ziffer zusammengefasst und als Hexadezimalzahl bezeichnet.

Das Umwandeln der Binärzahlen 0b0000 bis 0b1001 ist dabei noch einfach: die Dezimalziffern 0 bis 9 reichen dafür noch aus. Ab 0b1010 wird es aber schwieriger, die Ziffern 0b1010 bis 0b1111 gibt es im Dezimalsystem nicht. Für diese Ziffern wird im Hexadezimalsystem A bis F verwendet. Dezimal 12345 übersetzt sich zu hexadezimal 0x3039, denn
3 * 163 + 0 * 162 + 3 * 161 + 9 * 160


ist, mit den 16-er-Potenzen 1, 16, 256 und 4096 dasselbe wie 3*4096+3*16+9*1 = 12345. Aus den 14 Binärziffern macht das Hexadezimalsystem gerade mal vier Ziffern, eine gewaltige Vereinfachung.
Binärzahlen Hexadezimalzahlen Werkzeuge

Werkzeuge

Für die Umrechnerei von und in das Binär- und Hexadezimalsystem braucht man nicht unbedingt Kopfrechnen. Das machen so nette kleine Helferlein wie der beim Windows im Zubehör enthaltene Rechner calc.exe. Da gibt es im Menue unter "Ansicht" den Programmierermodus. Und der kennt Binär- und Hexadezimalzahlen:

Berechnen von Binär- und Hexzahlen Durch Klicken auf "Hex" oder "Bin" wird die Dezimalzahl flugs umgewandelt. Das Tool kann hexadezimal locker 64 Bits (was z. B. Taschenrechner, auch spezielle, nicht schaffen).

Binärzahlen Hexadezimalzahlen Werkzeuge


©2018 by www.gsc-elektronic.net