18. Bitmanipulationen Bitoperationen Bitmasken
Anwendung von Bits Statusanzeigen bei Ein-/Ausgabe (Stream-Klassen) Zugriffsrechte auf Dateien Maschinensteuerung/Gerätetreiber Status-/Steuerungsangaben für Anlagen Dr. Norbert Spangler / Grundlagen der Informatik 27.05.2007 2
Bitoperatoren & bitweises UND bitweises ODER ^ bitweises exklusives ODER (XOR) ~ Komplement NICHT << Links-Shift >> Rechts-Shift Die Operanden müssen vom ganzzahligen Typ sein. Die Bitoperatoren sollte man nicht mit den logischen Operatoren && bzw. verwechseln, welche stets auf die gesamte Zahl wirken und nicht auf die einzelnen Bits. Dr. Norbert Spangler / Grundlagen der Informatik 27.05.2007 3
Wahrheitstafeln UND Ergebnis 0 & 0 0 0 & 1 0 1 & 0 0 1 & 1 1 ODER Ergebnis 0 0 0 0 1 1 1 0 1 1 1 1 XOR Ergebnis 0 ^ 0 0 0 ^1 1 1 ^ 0 1 1 ^ 1 0 NICHT Ergebnis ~0 1 ~0 1 Dr. Norbert Spangler / Grundlagen der Informatik 27.05.2007 4
Aufgabe: Löschen von Bits Die Bits 3-7 und 10-12 in einem Operanden sollen gelöscht werden. Erzeugung einer Maske, welche an den zu löschenden Bitpositionen 0 hat und ansonsten 1 1110 0011 0000 0011 = E303 In C++: short maske=0xe303, operand=0xc1f1; Anwendung des UND-Operators operand 1100 0001 1111 0001=C1F1 ergebnis = operand & maske maske 1110 0011 0000 0011=E303 ergebnis 1100 0001 0000 0001=C101 Dr. Norbert Spangler / Grundlagen der Informatik 27.05.2007 5
Aufgabe: Löschen von Bits Spezialfall: alle Bits bis auf eines sind 0 (maske hat nur 1 gesetztes Bit). Anwendung des UND-Operators operand 1100 0001 1111 0001=C1F1 ergebnis = operand & maske maske 0000 0001 0000 0000=0101 ergebnis 0000 0001 0000 0000=0100 Ergebnis: Das Bit an der entsprechenden Position im Operanden wird übernommen und alle anderen werden gelöscht. D.h. ist das Ergebnis 0, war dieses Bit 0, ist das Ergebnis ungleich 0, war das Bit 1. Damit können einzelne Bits geprüft werden. Dr. Norbert Spangler / Grundlagen der Informatik 27.05.2007 6
Aufgabe: Setzen von Bits Die Bits 0-2,8-9,13-15 in einem Operanden sollen gesetzt werden. Erzeugung einer Maske, welche an den zu setzenden Bitpositionen 1 hat und ansonsten 0. 1110 0011 0000 0111 = E303 In C++: short maske=0xe303, operand=0xc1f1; Anwendung des ODER-Operators operand 1100 0001 1111 0001=C1F1 ergebnis = operand maske maske 1110 0011 0000 0011=E303 ergebnis 1110 0011 1111 0011=E3F3 Dr. Norbert Spangler / Grundlagen der Informatik 27.05.2007 7
Aufgabe: Invertieren von Bits Die Bits 0-2,8-9,13-15 in einem Operanden sollen invertiert werden. Erzeugung einer Maske, welche an den zu invertierenden Bitpositionen 1 hat und ansonsten 0 1110 0011 0000 0111 = E303 In C++: short maske=0xe303, operand=0xc1f1; Anwendung des XOR-Operators operand 1100 0001 1111 0001=C1F1 ergebnis = operand ^ maske maske 1110 0011 0000 0011=E303 ergebnis 0010 0010 1111 0010=22F2 Dr. Norbert Spangler / Grundlagen der Informatik 27.05.2007 8
Aufgabe: Invertieren aller Bits Anwendung des Nicht-Operators (anstelle der Variante mit einer Maske, in der alle Bitpositionen gesetzt sind + Anwendung des XOR-Operators) In C++: short operand=0xc1f1; ergebnis = ~operand operand 1100 0001 1111 0001=C1F1 ergebnis 0011 1110 0000 1110=3E0E Dr. Norbert Spangler / Grundlagen der Informatik 27.05.2007 9
Zusammenfassung operand & maske operand maske operand ^ maske Alle Bits, die in maske 0 sind, werden gelöscht Alle Bits, die in maske 1 sind, werden gesetzt Alle Bits, die in maske 1 sind, werden invertiert ~ maske Alle Bits werden invertiert Dr. Norbert Spangler / Grundlagen der Informatik 27.05.2007 10
Beispielprogramm #include <iomanip> #include<iostream> using namespace std; void main() { unsigned short operand=0xc1f1, maske=0xe303,ergebnis; // Bits loeschen ergebnis=maske & operand; cout << hex <<uppercase<< operand<<" & "<<maske<<" = "<< ergebnis <<endl; // Bits setzen ergebnis=maske operand; cout << operand<<" "<<maske<<" = "<< ergebnis <<endl; // Bits invertieren ergebnis=maske ^ operand; cout << operand<<" ^ "<<maske<<" = "<< ergebnis <<endl; // alle Bits invertieren ergebnis=~operand; cout << " ~ "<<operand<<" = "<< ergebnis <<endl; } Dr. Norbert Spangler / Grundlagen der Informatik 27.05.2007 11
Links- und Rechts-Shift Die Shiftoperatoren << und >> verschieben die Bits des linken Operanden um die Anzahl Positionen, die im rechten Operanden angegeben sind. Die herausgeschobenen Bits gehen verloren, es wird mit 0 aufgefüllt. y = x >> 4; // es wird um 4 Bits nach rechts verschoben und mit links mit 0 // aufgefüllt. z = x << 8; // es wird um 8 Bits nach links verschoben und rechts mit 0 // aufgefüllt. Beispiel: x=0x0064; y=x>>4; //Ergebnis ist 0x0006 z=x<<8;//ergebnis ist jetzt 0x0600 Dr. Norbert Spangler / Grundlagen der Informatik 27.05.2007 12
Bitstrukturen/Bitfelder Bitfelder werden als Datenelemente einer Klasse definiert. Beispiel: struct Feld { unsigned sensor1 : 1; unsigned sensor2 : 1; unsigned schalter1:1; unsigned :4; unsigned strom :1; unsinged status :4; unsigned id :4; } ; Dr. Norbert Spangler / Grundlagen der Informatik 27.05.2007 13
Bitfelder Die Struktur besteht aus 16 Bits. Die ersten 3 Bitfelder sind sensor1,sensor2 und schalter1 und haben je 1 Bit. Die nächsten 4 Bits werden nicht genutzt; Danach folgt das Bitfeld strom (1 Bit), dann die Bitfelder status und id zu je 4 Bits. Deklaration: Feld geraet; Zugriff: if ( geraet.sensor1 )... geraet.strom=0; usw. Die Maximallaenge ist ein Speicherwort ( z.b. 4 Bytes) Dr. Norbert Spangler / Grundlagen der Informatik 27.05.2007 14
Übungsaufgabe Es soll das Parity-Bit (für gerade Parity) einer Zahl bestimmt werden. Bei gerader Parity wird das Parity-Bit zu einem Datum so bestimmt, dass die Anzahl aller Bits inkl. dem Parity.Bit gerade ist. Dr. Norbert Spangler / Grundlagen der Informatik 27.05.2007 15
Lösung Es soll das Parity-Bit einer Zahl bestimmt werden. Lösung mit Schleife int parity(unsigned short n) { unsigned short par=0; while ( n!=0 ) { par^=(n & 0x0001); n>>=1; } return par; } Dr. Norbert Spangler / Grundlagen der Informatik 27.05.2007 16
Lösung Es soll das Parity-Bit einer Zahl bestimmt werden. Lösung mit Schleife int parity(unsigned short n) { unsigned short par=0; while ( n!=0 ) { par^=(n & 0x0001); n>>=1; } return par; } Lösung mit Rekursion? Dr. Norbert Spangler / Grundlagen der Informatik 27.05.2007 17
Lösung Es soll das Parity-Bit einer Zahl bestimmt werden. Lösung mit Rekursion int parity(unsigned short n) { if ( n==0 ) return 0; else return parity(n>>1) ^ (n&0x0001); } Dr. Norbert Spangler / Grundlagen der Informatik 27.05.2007 18