gfx gfx
gfx
homegfxgaestebuchgfxforumgfxkontaktgfximpressum
gfx
QBasic
  1. QB-Forum
  2. QB-Forum
  QB-MonsterFAQ
  Tutorials
AK-LIB
  Download
  Archiv
  Hilfe
  TroubleFAQ
  Tools
Projekte
  DosFont
Extras
  Links
Statistik
Tutorials
Zahlensysteme
Autor: Andre Klein
Co-Autor: Sandro Belfanti

       Abschnitt 1   Einleitung mit Dezimal
Wie die erste Silbe "Dez" schon sagt, handelt es sich um unser geläufiges Zahlensystem mit der Basis 10. Da das jeder kennt werde ich an diesem System versuchen einige Begriffe zu verdeutlichen.

Wir benutzen in diesem System die Zahlen von 0 bis 9. Das sind insgesamt 10 verschiedene Werte, und darum spricht man von der BASIS 10.
Die von uns am meisten benutzte Schreibform für Dezimal ist diese: 1234
Da weiß jeder, das es sich um die Zahl eintausendzweihundertundvierunddreißig handelt
eine andere Schreibweise wäre: (1*1000) + (2*100) + (3*10) + (4*1). Das Ergebnis ist das gleiche.
Bei dieser Schreibweise sehen wir das jeder Zahlenstelle ein Multiplikationsfaktor zugeordnet ist. Die ganz rechte Stelle wird mit 1 multipliziert, die nächste Stelle mit 10, dann folgt die 100 und dann die 1000.
Aber wie kommt man auf diese Werte?
Und zwar kann man diese Werte auch anders darstellen. Für den Wert 1000 z.B. kann man auch schreiben 10³ (10 hoch 3), was nichts anderes heißt als 10*10*10.
Für 100 wäre das dann 10² (10 hoch 2). Also 10*10.
Für 10 wäre das dann 10 hoch 1. Also 10
Und für 1 wäre das 10 hoch 0. Weil jede Zahl die hoch 0 genommen wird, definitionsmäßig 1 ist.
Im großen und ganzen ergibt das folgende Reihenfolge:
1. Stelle: (10 hoch 0) -> Faktor = 1
2. Stelle: (10 hoch 1) -> Faktor = 10
3. Stelle: (10 hoch 2) -> Faktor = 100
4. Stelle: (10 hoch 3) -> Faktor = 1000
5. Stelle: (10 hoch 4) -> Faktor = 10000
6. Stelle: (10 hoch 5) -> Faktor = 100000
7. Stelle: (10 hoch 6) -> Faktor = 1000000
8. Stelle: (10 hoch 7) -> Faktor = 10000000
9. Stelle: (10 hoch 8) -> Faktor = 100000000
Das sind dann die jeweiligen Faktoren für die angebene Stelle.
Und das waren dann auch schon die wichtigsten Dinge.

       Abschnitt 2   Hex-System
Das Hex-System funktioniert genau so wie das Dezimale, nur das wir hier anstatt der BASIS 10 die BASIS 16 haben.
Da wir aber nur 10 verschiedene Ziffern haben (0-9) müssen wir hier ein paar Buchstaben zur Hilfe nehmen.
Die Zahlen 0-9 kann man dann für die Zahlen 0-9 nehmen :-) und für die Zahlen von 10 - 15 nimmt man die Buchstaben A-F.
Das ergibt dann folgende Zählweise: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F.
Wobei das A dann für eine 10 steht, das B für eine 11 und zum Schluß das F für eine 15.
Die Schreibweise ist genauso wie bei Dezimal, das heißt ganz rechts ist die kleinste Stelle und ganz links ist die größte.
Der einzige Unterschied ist das wir jetzt mit anderen Faktoren rechnen müssen! Da die Basis 16 ist, ist der erste Faktor 16 hoch 0. Was wieder nichts anderes heißt als 1.
Der zweite Faktor ist 16 hoch 1. Das heißt logischerweise 16. Der Dritte Faktor ist 16² (16 hoch 2). Das wäre dann 256 usw usw.
Wenn wir jetzt die HEX-Zahl 1234 in eine Dezimal-Zahl umwandeln wollen, dann wäre das folgende Rechnung:
(1*4096) + (2*256) + (3*16) + (4*1)
Das Ergebnis lautet: 4660
Wenn du in Qbasic ganz normale Zahlen hinschreibst handelt es sich immer um Dezimalzahlen. Wenn du aber ein &H davor stellst dann weiß QB das es sich um eine Hex-Zahl handelt (z.B. &H1234).
Es gibt sogar Befehle die die Zahlen in andere Systeme umwandeln. Ein Beispiel dafür ist HEX$.
PRINT HEX$(4660) würde als Ergebnis 1234 liefern.
PRINT VAL("&H" + "1234") würde als Ergebnis 4660 liefern.

       Abschnitt 3   Octal-System
Beim Octal-System haben wir die BASIS 8. Das heißt das wir hier die Ziffern von 0-7 benutzen.
Die Faktorenreihenfolge ist folgende:
1. Stelle: 8 hoch 0 -> 1
2. Stelle: 8 hoch 1 -> 8
3. Stelle: 8 hoch 2 -> 64
4. Stelle: 8 hoch 3 -> 512
5. Stelle: 8 hoch 4 -> 4096
6. Stelle: 8 hoch 5 -> 32768
7. Stelle: 8 hoch 6 -> 262144
In Qbasic können Octal-Zahlen mit einem &O dargestellt werden. Zum Umwandeln gibt es den Befehl OCT$.
PRINT OCT$(20)
PRINT VAL("&O" + "24")
Dazu ist noch zu sagen das dieses Zahlen-System so gut wie nie irgendwo eingesetzt wird!

       Abschnitt 4   Binär-System
Jetzt kommen wir zu meinem Lieblings-Zahlen-System. :-)
Dieses Zahlensystem hat die BASIS 2. Daraus folgt das wir die Ziffern von 0 bis 1 benutzen.
Die Faktorenreihenfolge sieht so aus:
1. Stelle: 2 hoch 0 -> 1
2. Stelle: 2 hoch 1 -> 2
3. Stelle: 2 hoch 2 -> 4
4. Stelle: 2 hoch 3 -> 8
5. Stelle: 2 hoch 4 -> 16
6. Stelle: 2 hoch 5 -> 32
7. Stelle: 2 hoch 6 -> 64
8. Stelle: 2 hoch 6 -> 128
Jede einzelne Stelle wird in Programmierer-Kreisen BIT genannt. Ein BIT kann entweder LOW (0) oder HIGH(1) sein.
Jetzt schauen wir uns mal die QB-Befehle AND und OR an. Denn was QB dort macht ist eine BIT-Verknüpfung.
Als Beispiel nehmen wir zwei Zahlen. Die erste lautet 10011101 (157) und die zweite lautet 01001110 (78)
Was geschieht jetzt bei dem Befehl: PRINT 157 AND 78 ?
AND ist eine UND-Verknüpfung. Das heißt wenn zwei "Eingangsbits" 1 sind dann ist das "Ausgangsbit" auch 1 ansonsten ist es 0.
Unsere Zahlen:
10011101
01001110
Das Ergebnis:
00001100
Wie du sieht ist an der 3. und 4. Stelle in beiden Zahlen eine 1. Das bewirkt das in diesen Stellen beim Ergebnis auch eine 1 ist. Das Gesamtergebnis ist 12.

Beim OR-Befehl ist es so, das jedesmal wenn in mindestens einem "Eingangsbit" eine 1 ist im Ergebnis auch eine 1 steht.

       Abschnitt 5   Zusammengehörigkeit von HEX und BIN.
Vielleicht taucht die Frage auf, wieso braucht man Hex, wieso rechnet man nicht im Dezimalsystem? Nun der Computer rechnet an und für sich ja nur mit 1 und 0, also im Binärsystem. Das ist sehr kompliziert beziehungsweise die Zahlen werden lang und unübersichtlich.
Wenn man nun vom binär ins Dezimalsystem umrechnet, ist es so, dass wenn man im Dezimalsystem eine Stelle mehr braucht, im Binärsystem nicht auch dasselbe passiert. Das heisst wenn ich von 9 auf 10 gehe ist das binär 1001 und 1010.
Wenn man sich nun den Speicher anschauen möchte ist es sinnvoller wenn man ein System nimmt wo man gewisse Übergänge von einer zu zwei Stellen noch sehen kann. Deshalb wurde das Hex-System erfunden, denn &HF ist binär 1111, &H10 ist binär 10000.
Die einzelnen stellen einer Binärzahl nennt man Bits (von binary digit = digitale Stelle), 8 Bits geben 1 Byte, d.h. von 0-&HFF, bzw. 0-11111111 binär. Da die beiden Systeme so ähnlich sind ist es natürlich auch einfacher von Binär in Hex umzurechnen.
Sehen wir uns als Beispiel die Binärzahl 10110 an. In Dezimal entspricht sie 2^1+2^2+2^4=22. Das entspricht in Hex: &H16. Das ist jetzt natürlich viel zu kompliziert. Da wir wissen dass alle vier Stellen im Binärsystem eine Stelle im Hexsystem dazukommt, teilen wir das ganze in vierer Blöcke. 1 0110, für die letzte stelle ergibt sich: 2^1+2^2 = 6, das ist jetzt aber nicht mehr Dez sondern Hex. Das ist aber kein Problem da die Zahl ja nie grösser als 15=&HF werden kann.
Jetzt die nächste Stelle: 1 , ziemlich leicht, also jetzt nur noch zusammenhängen: 16.
Jetzt mal ein schwierigeres Beispiel: 101 1100 1010, diesmal direkt in Viererblöcken geschrieben. Die einzelnen Viererblöcke umrechnen: 1010=2+8=A, 1100=4+8=C und 101=4+1=5: Zusammengehängt wird das &H5CA. Wer will kann das über Dez nachrechnen, ich finde das zu mühsam.
Vom Hex zum Binär geht's genau gleich. ABC= A=2+8=1010 B=1+2+8=1011 C=4+8=1100: Ergebnis:101010111100 So hat das Hexadezimalsystem den Vorteil besser mit dem Binärsystem des Computers zusammenzupassen.

Wie sieht nun ein Computer die gespeicherten Dateien? Er speichert natürlich alles binär, da aber kein Mensch eine Schlange aus Nullen und Einsen interpretieren kann wird daraus eine sehr lange Hex Zahl gemacht. 9F 34 A3 42 könnte zum Beispiel ein Ausschnitt einer Datei sein. Jetzt muss das Programm das es öffnet wissen, was für ein Wert gespeichert wurde. Falls eine 1-Byte Variable gespeichert wurde hätte die den Wert 159 (=9F), eine mit 2 Bytes den Wert 40756 (=9F34), mit 4 den Wert 2671031106 (=9F34A342). Da ein Byte immer 2 Stellen der Zahl bedeutet kann man sehr schnell sehen was zu welcher Zahl gehört. Wie man sieht ändern sich die vordersten Ziffern der Dezimalzahl ständig, wenn man der Hexadezimal oder der Binärzahl Stellen anhängt.
In Hex-Form kann man sehr leicht entscheiden was die Bytes für (Hex) Werte haben, vor allem wenn man die Zahlen in Zweierblöcken schreibt. So sieht man sehr gut wieso man das Hex System braucht. Ob man aus 2671031106 eine 1 oder 2 Byte Zahl ausliest oder aus 9F 34 A3 42 beantwortet die Frage: "Wieso Hex" wohl ziemlich klar. Nun erklären sich auch die "komischen" Zahlen für die höchstwerte von Variablen. Ein Integer hat einen Wertebereich von -32.768 bis 32.767. Wenn man nun 32768+32767 rechnet gibt das 65535=&HFFFF, wie man sieht ist ein Integer eine zwei Byte Variable.

       Abschnitt 6   Hochwertige und niederwertige Bytes
Bei einer Hexzahl werden die Bytes von links nach rechts immer niederwertiger, wie auch bei den Dezimalzahlen. Wenn man nun einen Wert wie zum Beispiel ein Register auftrennen will in höhere und niedere Bytes ist das in Hex sehr klar: &HABCD: AB ist höher und CD niederwertig. Wenn die Zahl ABCD in einer Variable gespeichert ist kann man die nicht einfach in der Mitte zerschneiden und muss daher zu anderen Mitteln greifen. Wenn man nun die Dezimalzahl 1234 teilen müsste würde die höherwertige Zahl 12 heissen. Die könnte man durch teilen und abrunden einfach erhalten: fix(1234/100) bzw 1234\100. Das gleiche geht natürlich auch in Hex, man muss bloss durch &H100 teilen, also 256. fix(&HABCD/256)=AB.
Nun erinnern wir uns an die AND Verknüpfung: Immer dort wo bei beiden eine 1 steht, ist auch in der Ausgabe eine 1. Man braucht also nur einen "Filter" der überall dort eine eins hat wo ich die Ausgangszahl übernehmen möchte.
1010101111001101 &HABCD
0000000011111111 &H00FF = 255

--------------------------- AND
0000000011001101 &H00CD

Also der Code: a%= b% AND 255

Nachkommastellen
Selbstverständlich sind auch Nachkommastellen in anderen Zahlensystemen möglich. Im Zehnersystem sind die Nachkommastellen ja wie folgt:
0.125 entspricht 1*1/10+2*1/100+5*1/1000.
Die Nachkommastellen sind wie folgt aufgebaut:
10^-1 10^-2 10^-3 = 1/10, 1/100, 1/1000.
Im Dualsystem wird das zu ½, ¼, 1/8, 1/16=2^-1, 2^-2, 2^-3, 2^-4.
Also wird 0.125=1/8 zu 0.001 (0*1/2+0*1/4+1*1/8).
Im Hex-System zu 2*1/16 = &H0.2.
Bei Gleitkommazahlen wie Double wird oft die sogenannte Exponentialform verwendet.
1.234 * 10^3 = 1234 oder 1.234*10^-2=0.01234,
das geht natürlich auch in Hex: 1.A2E * 10^2 = 1A2.E.
ACHTUNG: Die 10 ist hier nicht "zehn", sondern "eins-null", d.h. 16 im Dezimalsystem. Diese Form hat den Vorteil dass man für 1/(2^20) nicht zwanzig Bits braucht.

         Abschluss   letzte Aktualisierung: 10.08.2003
So das war es erstmal. Wenn du weitere Fragen hast oder ich irgend etwas falsch beschrieben habe, dann Mail an Webmaster.




Werbung
Partner