Pfad:
Home ==>
Kurs ==> Bin/Hex-Zahlen
This page in English (external):
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.
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.
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.
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:
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).
©2018 by www.gsc-elektronic.net