www.wikidata.de-de.nina.az
In der Informationstechnik und Programmierung bezeichnet ein Bitfeld ein vorzeichenloses Integer in dem einzelne Bits oder Gruppen von Bits aneinandergereiht werden Es stellt eine Art Verbunddatentyp auf Bit Ebene dar Im Gegensatz dazu steht der primitive Datentyp bei dem der Wert aus allen Stellen gemeinsam gebildet wird Eine verbreitete Verwendung ist die bei der jede einzelne Binarstelle ein Flag reprasentiert Dabei entspricht jede Stelle einer booleschen Variablen Es konnen aber auch mehrere Stellen einen Wert bilden z B konnen in einem Byte auch zwei Nibbles zusammengefasst sein oder wie bei IPv4 Adressen ein 32 Bit Datenwort in beispielsweise 24 Bit Netzwerk und 8 Bit Hostteil aufgeteilt sein Es findet sich auch die Sprechweise Bitvektor ohne damit immer auszudrucken dass das einzelne Bit durch Indizierung ansprechbar ist Indizierung von Bits wird im Artikel Bitkette behandelt Inhaltsverzeichnis 1 Verwendung 1 1 Beispiel in OpenGL 1 1 1 Verwendung in C und C 2 Zugriff 2 1 Bit auslesen 2 2 Bits setzen 2 3 Bits umschalten 2 4 Bitmasken zusammenfassen 3 Siehe auch 4 EinzelnachweiseVerwendung BearbeitenBitfelder werden typischerweise bei der hardwarenahen oder der Systemprogrammierung eingesetzt Hier dienen sie haufig dazu bei Peripheriegeraten ein bestimmtes Verhalten einzustellen Das liegt daran dass bspw das Aktivieren einer bestimmten Funktionalitat in Hardware leicht uber das Setzen einer einzigen Datenleitung einem Bit signalisiert werden kann Um einfacher mit der Software oder anderen Geraten zu kommunizieren oder weil bspw I O Ports nur in begrenzter Menge vorhanden sind werden mehrere solcher Leitungen dann zu einem Datenwort zusammengefasst dem Bitfeld Daneben werden Bitfelder aber auch bei der Anwendungsprogrammierung verwendet wo eine Vielzahl an Parametern ubergeben werden soll Hier kann die Lesbarkeit des Quellcodes verbessert werden wenn statt einer langen Parameterliste bei der jeder Parameter explizit angegeben werden muss nur ein Bitfeld mit den gewunschten Flags zusammengestellt wird Bitfelder zu verwenden um Speicherplatz einzusparen macht in der Anwendungsprogrammierung heutzutage nicht mehr so viel Sinn ausser in seltenen Fallen wie z B bei eingebetteten Systemen wenn Speicher eine extrem knappe Ressource ist oder wenn die Bits in ausserordentlich grosser Zahl benotigt werden wie beim Sieb des Eratosthenes 1 Es wird fur boolesche Variablen meist ein ganzes Byte oder Wort verwendet Auch ist der Zugriff auf einzelne Bits eines Datenworts oft ineffizienter als auf das gesamte Datenwort Beispiel in OpenGL Bearbeiten In OpenGL wird bspw die Funktion glClear definiert welche einen oder mehrere von vier Grafikpuffern loscht Die Entwickler hatten nun vier Parameter definieren konnen welche jeweils angeben ob der Grafikpuffer geloscht werden soll oder nicht Der Funktionsaufruf wurde folgendermassen aussehen void glClear 1 1 0 0 Dies ist aber weder effizient da vier Variablen ubergeben werden mussen noch sehr leserlich Daher wurde in der gl h fur jeden Puffer ein sogenanntes benanntes Flag definiert define GL DEPTH BUFFER BIT 0x00000100 define GL ACCUM BUFFER BIT 0x00000200 define GL STENCIL BUFFER BIT 0x00000400 define GL COLOR BUFFER BIT 0x00004000 Und fur die Funktion wurde nur ein einzelner Parameter definiert void glClear GLbitfield mask GLbitfield ist ein typedef auf unsigned int Der Funktionsaufruf sieht nun folgendermassen aus glClear GL COLOR BUFFER BIT GL DEPTH BUFFER BIT Verwendung in C und C Bearbeiten In der Programmiersprache C ist es moglich in Datenstrukturen Bitfelder zu definieren und damit kleinere Datentypen kompakt zu speichern Solange die Daten ausschliesslich uber die Feldnamen adressiert werden wird der Quellcode dadurch nicht abhangig vom Compiler oder vom Prozessor Fur Zugriffe auf Teile von Registern oder deserialisierte Daten gilt das nicht struct struct type name type name1 length type name2 length type nameN length variable list In der Programmiersprache C ist es mittels der Flags Attribute moglich eine Enumeration als Bitfeld zu deklarieren 2 Ausserdem stellt das NET Framework die Datenstruktur BitArray zur Verfugung welche einzelne Bits kompakt speichert und boolesche Operationen ermoglicht Zugriff BearbeitenDer Zugriff auf ein einzelnes Bit sowohl in testender als auch setzender Weise wird von der Hardware ahnlich gut unterstutzt wie der Zugriff auf ein Byte oder Wort es genugt bei vielen Maschinen ein einziger Befehl Die Unterstutzung durch die Compiler ist aber haufig ahnlich wie beim Zugriff auf mehrere Bits bei dem die Bitgruppe vor dem Vergleich oder der Manipulation durch eine Bitmaske aus dem Speicherwort herausprapariert werden muss Als Bitmasken werden Bitfelder bezeichnet deren Stellen selbst keine Information reprasentieren sondern die dazu verwendet werden um Bitfelder auszulesen oder zu manipulieren Ein in der Netzwerktechnik verbreitetes Beispiel fur eine Bitmaske ist die Netzmaske Sie bestimmt welche der fuhrenden Bits einer IP Adresse das Netzprafix sind d h welcher Adressbereich als internes und welcher als externes Netz beim Routen betrachtet wird Bit auslesen Bearbeiten Um ein oder mehrere Bits aus einem Bitfeld auszulesen wird es mit einer Bitmaske uber die bitweise Und Operation verknupft In der Bitmaske stehen an allen Stellen die nicht betrachtet werden sollen eine 0 Diese Stellen werden durch die UND Verknupfung ausgeblendet d h auf Null gesetzt Die Stellen die betrachtet oder ausgelesen werden sollen enthalten eine 1 in der Bitmaske und werden daher unverandert aus dem Bitfeld ins Ergebnis ubernommen Beispiel1 Bit 01001011 Bitfeld AND 00001000 Bitmaske 00001000 Ergebnis 0 Bit 01001011 Bitfeld AND 00000100 Bitmaske 00000000 Ergebnis Das Ergebnis ist Null wenn die Stellen der Bitmaske im Bitfeld ebenfalls Null sind Ist mindestens eines davon auf 1 gesetzt sind die entsprechenden Bits auch im Ergebnis 1 d h das Ergebnis ist ungleich Null Da Werte von Null in den meisten Programmiersprachen zu einem logischen false und Werte ungleich Null zu einem logisch true ausgewertet werden kann nun das Ergebnis leicht mit einer bedingten Verzweigung daraufhin uberpruft werden ob eines der Bits der Bitmaske im Feld gesetzt war if Ergebnis Bit gesetzt else Bit nicht gesetzt Bits setzen Bearbeiten Sollen Bits im Bitfeld einen bestimmten Wert annehmen mussen die entsprechenden Stellen im Bitfeld auf 1 und alle anderen auf 0 gesetzt werden Um die Stellen auf 1 zu setzen muss das Bitfeld mit der Bitmaske addiert oder uber ein bitweises Oder verknupft werden Umgekehrt erhalt man an den gewunschten Stellen eine 0 wenn man Feld und Maske uber ein NAND verknupft also zuerst die Maske invertiert und sie dann uber eine Und Operation mit dem Feld verknupft BeispielSetzen von Bits auf 1 01001011 Bitfeld OR 00000100 Bitmaske 01001111 Ergebnis Setzen von Bits auf 0 NOT 00001000 Bitmaske 11110111 invertierte Bitmaske AND 01001011 Bitfeld 01000011 Ergebnis Bits umschalten Bearbeiten Sollen einzelne Bits umgeschaltet englisch to toggle bzw invertiert werden setzt man die entsprechenden Stellen in der Bitmaske auf 1 und alle anderen auf 0 und verknupft Bitfeld und Bitmaske uber ein exklusives Oder 01001011 Information XOR 00000110 Bitmaske 01001101 Ergebnis Bitmasken zusammenfassen Bearbeiten Bitmasken konnen zusammengefasst werden z B um in einer Operation mehrere Bits auf einmal zu uberprufen oder zu setzen Dazu addiert man lediglich die einzelnen Bitmasken oder verknupft sie uber ein bitweises Oder 00000001 Bitmaske1 OR 00000010 Bitmaske2 00000011 zusammengefasste BitmaskeSiehe auch BearbeitenBitketteEinzelnachweise Bearbeiten Die Verwendung von Bitfeldern beliebiger Ausdehnung und mit einer Indexvariablen wird im Artikel Bitkette ausfuhrlicher behandelt http msdn microsoft com de de library system flagsattribute aspx Abgerufen von https de wikipedia org w index php title Bitfeld amp oldid 226993613 Bitmaske