1.1 IT-Zahlensysteme
Die derzeitige Informationstechnik arbeitet mit Datenleitungen und Speichern, die nur zwei Zustände kennen:
0 und 1 -Binär.
Das Bit ist die kleinste Datenspeichereinheit und kann die Werte 0 oder 1 speichern, ein binärer Speicher.
Wenn ich mehr als 2 Werte speichern will muss ich mehr Bits kombinieren. Bsp. 2 Bits:
Kombination | Bit1 | Bit0 |
---|---|---|
00 | 0 | 0 |
01 | 0 | 1 |
10 | 1 | 0 |
11 | 1 | 1 |
Jedes weitere Bit verdoppelt die Anzahl der Kombinationen: Schreibe alle Kombinationen mit n Bits auf und schreibe überall links eine 0 davor, dann schreibe alle Kombinationen mit n Bit und einer 1 davor darunter:
Die Anzahl der möglichen Kombinationen mit n Bits lässt sich leicht berechnen: 2n
Wie viele Kombinationen gibt es mit 4 Bits, schreibe alle auf. Wie viele Bits braucht es für 16, 32, .. Werte?
Kombination | Bit2 | Bit1 | Bit0 |
---|---|---|---|
000 | 0 | 0 | 0 |
001 | 0 | 0 | 1 |
010 | 0 | 1 | 0 |
011 | 0 | 1 | 1 |
100 | 1 | 0 | 0 |
101 | 1 | 0 | 1 |
110 | 1 | 1 | 0 |
111 | 1 | 1 | 1 |
Bits | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
# Werte | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 256 | 512 | 1024 | 2048 | 4096 | 8192 | 16384 | 32768 | 65536 |
Binäre Kodierung von Information
Nun haben wir also Bits als Datenspeicher und können Kombinationen aufschreiben. Aber welche Bedeutung haben diese Kombinationen. Bsp. Die Werte 0..3 sollen binär gespeichert werden… Möglichkeiten…
Stellenwertsystem, Dualzahlen, Umrechnen siehe https://mezdata.de/ti-basis/010_zahlensysteme/index.php
Achtung Verwirrung: Binärzahl meint einfach die Darstellung von Information mit 0en und 1en. Dualzahl ist die Kodierung mit dem Stellenwertsystem eines Dezimalwertes in eine Binärzahl, also eine spezielle von vielen möglichen Kodierungen. Es gibt noch andere technisch praktische Kodierungen von Dezimalwerten zu Binärzahlen, z.B. der Gray-Code.
Welchen Wert hat die Größte-Dual-Zahl (GDZ) mit n Bit?
Bits | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
GDZ Dual | 0b1 | 0b11 | 0b111 | 0b1111 | 0b11111 | 0b111111 | 0b1111111 | 0b11111111 | 9 1en | 10 1en | 11 1en | 12 1en |
GDZ Dez | 1 | 3 | 7 | 15 | 31 | 63 | 127 | 255 | 511 | 1023 | 2047 | 4095 |
GDZ Hex | 0x1 | 0x3 | 0x7 | 0xF | 0x1F | 0x3F | 0x7F | 0xFF | 0x1FF | 0x3FF | 0x7FF | 0xFFF |
Besser lesbar durch Hexadezimalsystem
Viele 0en und 1en hintereinander sind schlecht lesbar, deshalb werden gerne 4 Bit zu einer Hexadezimal-Ziffer zusammen gefasst. Da 4 Bit die 16 (Hexadezimal) Werte von 0..15 haben können sind für die Werte 10..15 weitere Ziffern notwendig, deshalb werden schlicht die Buchstaben A..F dafür verwendet.
Wert | 1 | 2 | .. | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Dual | 0b0001 | 0b0010 | .. | 0b1000 | 0b1001 | 0b1010 | 0b1011 | 0b1100 | 0b1101 | 0b1110 | 0b1111 | 0b10000 |
Hex | 0x1 | 0x2 | .. | 0x8 | 0x9 | 0xA | 0xB | 0xC | 0xD | 0xE | 0xF | 0x10 |
4 Bit sind ein Nibble, 8 Bit sind ein Byte. 16 bzw. 32 Bit werden als Wort , 32 bzw. 64 Bit als Doppelwort bezeichnet. Siehe Wikipedia [Datenwort]. Umwandeln von Bin<->Hex, Dez<->Hex siehe https://mezdata.de/ti-basis/010_zahlensysteme/index.php
Einheiten KiB, MiB…
Sollen grössere Mengen von Bytes gut lesbar angegeben werden bieten sich Abkürzungen wie Kilo und Mega usw. an. Z.B. 1000 Byte = 1 kB (Kilobyte). Allerdings wird bei Speicherbausteinen nicht das Dezimal- sondern das Binärsystem verwendet, daher bekommt man eher 1024 Byte und nicht 1000 Byte. Dies führte zu Verwirrung:
[Wikipedia: Bedeutungen von Dezimal- und Binärpräfixen für große Anzahlen von Bytes]
Daher wurde für Anwendungen mit binär adressierten Speichern Binäreinheiten eingeführt Ki = 1024 statt k = 1000, das B wird oft weggelassen also Ki statt KiB, Mi statt MiB.
Hinweis: Das Wort oder der Begriff Anzahl oder Nummer wird oft mit # verkürzt: Anzahl Bits -> # Bits
# Bits zur Kodierung der Anzahl | 10 | 20 | 30 | 40 | 50 | 60 | 70 |
---|---|---|---|---|---|---|---|
Wert | 210 = 1024 | 220 = 10242 | 230 = 10243 | 240 | 250 | 260 | 270 |
Bezeichnung | Ki | Mi | Gi | Ti | Pi | Ei | Zi |
Praktischer Nutzen, typische Beispiele:
Wie viele Werte können mit 16 Bit kodiert werden? 216 = 26 * 210 = 64 Ki Werte
Wie viele Farben können mit 3 Byte kodiert werden? 3*8=24; 224 = 24 * 220 = 16 Mi Farben: ca. 16 Millionen Farben
ToDo: Negative Zahlen, Rechnen,
Auf meiner „alten“ Seite: https://mezdata.de/ti-basis/010_zahlensysteme/index.php
Spiel zum Üben: https://games.penjee.com/binary-numbers-game/
Arbeitsblatt zum Üben
Hier die Tabellenkalkulation um ein Arbeitsblatt zu erstellen, die Werte werden durch Zufall erzeugt.
Negative Zahlen
MezMedia: Datendarstellung in Digitalen Systemen
Wikipedia: Zweierkomplement
- Anzahl # der Bits im Datentyp wissen z.B. byte hat 8 Bit weil
- Das MSB (Most Significant Bit), das Bit ganz links gibt das Vorzeichen an
- MSB = 0 ist positiv, MSB = 1 ist negativ
- Vorzeichen wechseln also -zahl geht so:
- zahl binär hinschreiben
- Einerkomplement von zahl bilden: ~zahl (alle Bits umdrehen)
- Zweierkomplement ist -zahl = ~zahl + 1, einfach +1 machen und den Übertrag ignorieren.
Übung: 8-Bit Zahlen mit Vorzeichen (Java: byte, C: signed char, int8_t)
Dezimal | Dualzahl | Hexadezimal |
---|---|---|
-1 | 0b11111111 | 0xFF |
127 | 0b01111111 | 0x7F |
-128 | 0b10000000 | 0x80 |
0x81 | ||
-2 | ||
0xAA |
Lösung
Dezimal | Dualzahl | Hexadezimal |
---|---|---|
-127 | 0b1000 0001 | 0x81 |
-2 | 0b1111 1110 | 0xFE |
-86 | 0x1010 1010 | 0xAA |
Datentypen bei Java
https://docs.oracle.com/javase/8/docs/api/constant-values.html#java.lang🔗
Datentyp | #Bits | #Werte | Wertebereich | C |
---|---|---|---|---|
boolean | 8 | 2 | false, true | |
byte | 8 | 256 | -128..127 (-27..27-1) | int8_t |
char | 16 | 65536 = 64 Ki | Unicode \u0000..\uFFFFF (0..216) | uint16_t |
short | 16 | 65536= 64 Ki | -32768..32767 (-215..215-1) | int16_t |
int | 32 | 232 = 4 Gi | -2 Gi..2 Gi -1 (-231..231-1) | int32_t |
long | 64 | 264 | -263..263-1 | – |
float | 32 | 232 | ca. +-1.4 * 10-45 .. +-3.4 * 1038 Genauigkeit ca. 7 Stellen | float |
double | 64 | 264 | ca. +-4.9 * 10-324 .. +-1.8 * 10308 Genauigkeit ca. 15 Stellen | double |
🧠 Bonus: Ganze Zahlen in Dual mit Java ausgeben
public class Binaerausgeben{
public static String classicToBin(int n){ // funktioniert für pos. Werte
String s ="";
while(n!=0){ // Klassicher Rest Div Algorithmus
if(n%2==0) s='0'+s;
else s='1'+s;
n/=2;
}
return "0b"+s;
}
public static String byteToBin(byte n){ // auch neg. Werte möglich
String s ="";
for(byte m=0;m<8;m++){ // die Bits einzeln abfragen
if((n&(1<<m))==0) s='0'+s;
else s='1'+s;
}
return "0b"+s;
}
public static String intToBin(int n){
String s ="";
for(int m=0;m<32;m++){ // die Bits einzeln abfragen
if((n&(1<<m))==0) s='0'+s;
else s='1'+s;
}
return "0b"+s;
}
public static void test(){
int i = -1;
System.out.println(i%2);// Test für Modulo bei neg. Zahl
}
public static void ausgebenTabelle(){
System.out.println("\fDezimal Dual Hex");
for(byte b=-128;b<0;b++){
System.out.format("%4d %s 0x%X\n",b,byteToBin(b),b);
}
}
}
Ausgabe Tabelle mit negativen Byte-Werten
Dezimal Dual Hex
-128 0b10000000 0x80
-127 0b10000001 0x81
-126 0b10000010 0x82
-125 0b10000011 0x83
-124 0b10000100 0x84
-123 0b10000101 0x85
-122 0b10000110 0x86
-121 0b10000111 0x87
-120 0b10001000 0x88
-119 0b10001001 0x89
-118 0b10001010 0x8A
-117 0b10001011 0x8B
-116 0b10001100 0x8C
-115 0b10001101 0x8D
-114 0b10001110 0x8E
-113 0b10001111 0x8F
-112 0b10010000 0x90
-111 0b10010001 0x91
-110 0b10010010 0x92
-109 0b10010011 0x93
-108 0b10010100 0x94
-107 0b10010101 0x95
-106 0b10010110 0x96
-105 0b10010111 0x97
-104 0b10011000 0x98
-103 0b10011001 0x99
-102 0b10011010 0x9A
-101 0b10011011 0x9B
-100 0b10011100 0x9C
-99 0b10011101 0x9D
-98 0b10011110 0x9E
-97 0b10011111 0x9F
-96 0b10100000 0xA0
-95 0b10100001 0xA1
-94 0b10100010 0xA2
-93 0b10100011 0xA3
-92 0b10100100 0xA4
-91 0b10100101 0xA5
-90 0b10100110 0xA6
-89 0b10100111 0xA7
-88 0b10101000 0xA8
-87 0b10101001 0xA9
-86 0b10101010 0xAA
-85 0b10101011 0xAB
-84 0b10101100 0xAC
-83 0b10101101 0xAD
-82 0b10101110 0xAE
-81 0b10101111 0xAF
-80 0b10110000 0xB0
-79 0b10110001 0xB1
-78 0b10110010 0xB2
-77 0b10110011 0xB3
-76 0b10110100 0xB4
-75 0b10110101 0xB5
-74 0b10110110 0xB6
-73 0b10110111 0xB7
-72 0b10111000 0xB8
-71 0b10111001 0xB9
-70 0b10111010 0xBA
-69 0b10111011 0xBB
-68 0b10111100 0xBC
-67 0b10111101 0xBD
-66 0b10111110 0xBE
-65 0b10111111 0xBF
-64 0b11000000 0xC0
-63 0b11000001 0xC1
-62 0b11000010 0xC2
-61 0b11000011 0xC3
-60 0b11000100 0xC4
-59 0b11000101 0xC5
-58 0b11000110 0xC6
-57 0b11000111 0xC7
-56 0b11001000 0xC8
-55 0b11001001 0xC9
-54 0b11001010 0xCA
-53 0b11001011 0xCB
-52 0b11001100 0xCC
-51 0b11001101 0xCD
-50 0b11001110 0xCE
-49 0b11001111 0xCF
-48 0b11010000 0xD0
-47 0b11010001 0xD1
-46 0b11010010 0xD2
-45 0b11010011 0xD3
-44 0b11010100 0xD4
-43 0b11010101 0xD5
-42 0b11010110 0xD6
-41 0b11010111 0xD7
-40 0b11011000 0xD8
-39 0b11011001 0xD9
-38 0b11011010 0xDA
-37 0b11011011 0xDB
-36 0b11011100 0xDC
-35 0b11011101 0xDD
-34 0b11011110 0xDE
-33 0b11011111 0xDF
-32 0b11100000 0xE0
-31 0b11100001 0xE1
-30 0b11100010 0xE2
-29 0b11100011 0xE3
-28 0b11100100 0xE4
-27 0b11100101 0xE5
-26 0b11100110 0xE6
-25 0b11100111 0xE7
-24 0b11101000 0xE8
-23 0b11101001 0xE9
-22 0b11101010 0xEA
-21 0b11101011 0xEB
-20 0b11101100 0xEC
-19 0b11101101 0xED
-18 0b11101110 0xEE
-17 0b11101111 0xEF
-16 0b11110000 0xF0
-15 0b11110001 0xF1
-14 0b11110010 0xF2
-13 0b11110011 0xF3
-12 0b11110100 0xF4
-11 0b11110101 0xF5
-10 0b11110110 0xF6
-9 0b11110111 0xF7
-8 0b11111000 0xF8
-7 0b11111001 0xF9
-6 0b11111010 0xFA
-5 0b11111011 0xFB
-4 0b11111100 0xFC
-3 0b11111101 0xFD
-2 0b11111110 0xFE
-1 0b11111111 0xFF