<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Bitfeld</id>
	<title>Bitfeld - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Bitfeld"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Bitfeld&amp;action=history"/>
	<updated>2026-05-23T20:26:28Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Bitfeld&amp;diff=415213&amp;oldid=prev</id>
		<title>imported&gt;MovGP0: /* Siehe auch */ + Link auf Bitfelddiagramm</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Bitfeld&amp;diff=415213&amp;oldid=prev"/>
		<updated>2024-07-14T11:52:42Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Siehe auch: &lt;/span&gt; + Link auf Bitfelddiagramm&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;In der [[Informationstechnik]] und [[Programmierung]] bezeichnet ein &amp;#039;&amp;#039;&amp;#039;Bitfeld&amp;#039;&amp;#039;&amp;#039; ein vorzeichenloses [[Integer (Datentyp)|Integer]], in dem einzelne [[Bit]]s oder Gruppen von Bits aneinandergereiht werden. Es stellt eine Art [[Verbund (Datentyp)|Verbunddatentyp]] auf Bit-Ebene dar. Im Gegensatz dazu steht der [[Primitiver Datentyp|primitive Datentyp]], bei dem der Wert aus allen [[Stellenwertsystem|Stellen]] gemeinsam gebildet wird.&lt;br /&gt;
&lt;br /&gt;
Eine verbreitete Verwendung ist die, bei der jede einzelne Binärstelle ein [[Flag (Informatik)|Flag]] repräsentiert. Dabei entspricht jede Stelle einer [[Boolesche Variable|booleschen Variablen]]. Es können aber auch mehrere Stellen einen Wert bilden, z.&amp;amp;nbsp;B. können in einem [[Byte]] auch zwei [[Nibble]]s zusammengefasst sein oder, wie bei [[IPv4]]-Adressen, ein 32-Bit-Datenwort in (beispielsweise) 24-Bit-Netzwerk- und 8-Bit-Hostteil aufgeteilt sein.&lt;br /&gt;
&lt;br /&gt;
Es findet sich auch die Sprechweise „Bitvektor“, ohne damit immer auszudrücken, dass das einzelne Bit durch [[Feld (Datentyp)#Standard-Feld|Indizierung]] ansprechbar ist. Indizierung von Bits wird im Artikel [[Bitkette]] behandelt.&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
Bitfelder werden typischerweise bei der hardwarenahen oder der [[Systemprogrammierung]] eingesetzt. Hier dienen sie häufig dazu, bei [[Peripheriegerät]]en ein bestimmtes Verhalten einzustellen. Das liegt daran, dass bspw. das Aktivieren einer bestimmten Funktionalität in Hardware leicht über das Setzen einer einzigen Datenleitung, eines Bits, signalisiert werden kann. Um einfacher mit der Software oder anderen Geräten zu kommunizieren oder weil bspw. I/O-Ports nur in begrenzter Menge vorhanden sind, werden dann mehrere solche Leitungen zu einem Datenwort zusammengefasst, dem Bitfeld.&lt;br /&gt;
&lt;br /&gt;
Daneben werden Bitfelder aber auch bei der [[Anwendungsprogrammierung]] verwendet, wenn eine Vielzahl an Parametern übergeben werden soll. Hier kann die Lesbarkeit des Quellcodes verbessert werden, wenn statt einer langen Parameterliste, bei der jeder [[Parameter (Informatik)|Parameter]] explizit angegeben werden muss, nur ein Bitfeld mit den gewünschten Flags zusammengestellt wird.&lt;br /&gt;
&lt;br /&gt;
Bitfelder zu verwenden, um Speicherplatz einzusparen, ist in der Anwendungsprogrammierung im Allgemeinen heutzutage nicht mehr so sinnvoll. Ausnahmen bestehen z.&amp;amp;nbsp;B. bei [[Eingebettetes System|eingebetteten Systemen]], wenn Speicher eine extrem knappe Ressource ist, oder wenn die Bits in außerordentlich großer Zahl benötigt werden wie beim [[Sieb des Eratosthenes]].&amp;lt;ref&amp;gt;Die Verwendung von Bitfeldern beliebiger Ausdehnung und mit einer Indexvariablen wird im Artikel [[Bitkette]] ausführlicher behandelt.&amp;lt;/ref&amp;gt; Für boolesche Variablen wird meist ein ganzes Byte oder Wort verwendet. Auch ist der Zugriff auf einzelne Bits eines Datenworts oft ineffizienter als der auf das ganze Datenwort.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel in OpenGL ===&lt;br /&gt;
In [[OpenGL]] wird bspw. die [[Funktion (Programmierung)|Funktion]] &amp;#039;&amp;#039;glClear&amp;#039;&amp;#039; definiert, die einen oder mehrere von vier [[Puffer (Informatik)|Grafikpuffern]] löscht. Die [[Softwareentwickler|Entwickler]] hätten nun vier [[Parameter (Informatik)|Parameter]] definieren können, die jeweils angeben, ob der Grafikpuffer gelöscht werden soll oder nicht. Der Funktionsaufruf würde folgendermaßen aussehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 void glClear(1, 1, 0, 0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies ist aber weder effizient, da vier Variablen übergeben werden müssen, noch sehr leserlich. Daher wurde in der &amp;#039;&amp;#039;gl.h&amp;#039;&amp;#039; für jeden Puffer ein sogenanntes &amp;#039;&amp;#039;benanntes Flag&amp;#039;&amp;#039; definiert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 #define GL_DEPTH_BUFFER_BIT               0x00000100&lt;br /&gt;
 #define GL_ACCUM_BUFFER_BIT               0x00000200&lt;br /&gt;
 #define GL_STENCIL_BUFFER_BIT             0x00000400&lt;br /&gt;
 #define GL_COLOR_BUFFER_BIT               0x00004000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und für die Funktion wurde nur ein einzelner Parameter definiert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 void glClear(GLbitfield mask); // GLbitfield ist ein typedef auf unsigned int&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Funktionsaufruf sieht nun folgendermaßen aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Verwendung in C und C# ====&lt;br /&gt;
In der Programmiersprache [[C (Programmiersprache)|C]] ist es möglich, in Datenstrukturen Bitfelder zu definieren und damit kleinere Datentypen kompakt zu speichern. Solange die Daten ausschließlich über die Feldnamen adressiert werden, wird der [[Quellcode]] dadurch nicht abhängig vom [[Compiler]] oder vom [[Prozessor]]. Für Zugriffe auf Teile von [[Register (Computer)|Register]]n oder [[Deserialisierung|deserialisierte]] Daten gilt das nicht.&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 struct struct-type-name {&lt;br /&gt;
     type [name1] : length;&lt;br /&gt;
     type [name2] : length;&lt;br /&gt;
     //…&lt;br /&gt;
     type [nameN] : length;&lt;br /&gt;
 } variable-list;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Programmiersprache [[C-Sharp|C#]] ist es mittels der &amp;#039;&amp;#039;Flags Attributes&amp;#039;&amp;#039; möglich, eine [[Aufzählungstyp|Enumeration]] als Bitfeld zu deklarieren.&amp;lt;ref&amp;gt;{{Internetquelle |url=http://msdn.microsoft.com/de-de/library/system.flagsattribute.aspx |titel=FlagsAttribute Klasse |werk=msdn.microsoft.com |abruf=2024-01-27}}&amp;lt;/ref&amp;gt; Außerdem stellt das [[.NET Framework]] die [[Datenstruktur]] &amp;#039;&amp;#039;BitArray&amp;#039;&amp;#039; zur Verfügung, die einzelne Bits kompakt speichert und boolesche Operationen ermöglicht.&lt;br /&gt;
&lt;br /&gt;
== Zugriff{{Anker|Bitmaske}} ==&lt;br /&gt;
Der Zugriff auf ein einzelnes Bit, sowohl in testender als auch in setzender Weise, wird von der Hardware (je nach [[Befehlssatzarchitektur]]) ähnlich gut unterstützt wie der Zugriff auf ein Byte oder Wort&amp;amp;nbsp;– es genügt bei vielen Maschinen ein einziger Befehl. Die Unterstützung durch die Compiler ist aber (je nachdem, wie [[Programmoptimierung|sie optimieren]]) häufig ähnlich wie beim Zugriff auf mehrere Bits, bei dem die Bitgruppe vor dem Vergleich oder der Manipulation durch eine &amp;#039;&amp;#039;&amp;#039;Bitmaske&amp;#039;&amp;#039;&amp;#039; aus dem Speicherwort „herauspräpariert“ werden muss. Als Bitmasken werden Bitfelder bezeichnet, deren Stellen selbst nicht die zu verarbeitende Information repräsentieren, sondern die verwendet werden, um die das Bitfeld umfassenden Bits zu markieren.&lt;br /&gt;
&lt;br /&gt;
Ein in der Netzwerktechnik verbreitetes Beispiel für eine Bitmaske ist die [[Netzmaske]]. Sie bestimmt, welche der führenden Bits einer IP-Adresse das Netzpräfix sind, d.&amp;amp;nbsp;h., welcher Adressbereich als internes und welcher als externes Netz beim Routen betrachtet wird.&lt;br /&gt;
&lt;br /&gt;
=== Bit auslesen ===&lt;br /&gt;
Um ein oder mehrere Bits aus einem Bitfeld auszulesen, wird Letzteres mit einer Bitmaske über die [[Bitweiser Operator|bitweise]] [[Und-Gatter|Und-Operation]] verknüpft. In der Bitmaske steht an allen Stellen, die nicht betrachtet werden sollen, eine „0“. Diese Stellen werden durch die UND-Verknüpfung ausgeblendet, d.&amp;amp;nbsp;h. auf Null gesetzt. Die Stellen, die betrachtet oder ausgelesen werden sollen, enthalten eine „1“ in der Bitmaske und werden daher unverändert aus dem Bitfeld ins Ergebnis übernommen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
1-Bit:&lt;br /&gt;
&lt;br /&gt;
     0100&amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;011 Bitfeld&lt;br /&gt;
 AND 0000&amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;000 Bitmaske&lt;br /&gt;
 -------------&lt;br /&gt;
 =   0000&amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;000 Ergebnis&lt;br /&gt;
&lt;br /&gt;
0-Bit:&lt;br /&gt;
&lt;br /&gt;
     01001&amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039;11 Bitfeld&lt;br /&gt;
 AND 00000&amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;00 Bitmaske&lt;br /&gt;
 -------------&lt;br /&gt;
 =   00000&amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039;00 Ergebnis&lt;br /&gt;
&lt;br /&gt;
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.&amp;amp;nbsp;h., das Ergebnis ist ungleich Null.&lt;br /&gt;
&lt;br /&gt;
Da Werte von Null in den meisten Programmiersprachen zu einem logischen &amp;#039;&amp;#039;false&amp;#039;&amp;#039; und Werte ungleich Null zu einem logisch &amp;#039;&amp;#039;true&amp;#039;&amp;#039; ausgewertet werden, kann nun das Ergebnis leicht mit einer [[Bedingte Verzweigung|bedingten Verzweigung]] daraufhin überprüft werden, ob eines der Bits der Bitmaske im Feld gesetzt war:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (Ergebnis)&lt;br /&gt;
   // Bit gesetzt&lt;br /&gt;
else&lt;br /&gt;
   // Bit nicht gesetzt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bits setzen ===&lt;br /&gt;
Sollen Bits im Bitfeld einen bestimmten Wert annehmen, müssen die entsprechenden Stellen der Bitmaske auf „1“ und alle anderen auf „0“ gesetzt werden. Um die Stellen auf „1“ zu setzen, muss das Bitfeld mit der Bitmaske bitweise [[Oder-Gatter|oder-verknüpft]] werden. Umgekehrt erhält man an den gewünschten Stellen eine „0“, wenn man Feld und die [[Nicht-Gatter|invers]]e Maske über eine [[UND-Gatter|Und-Operation]] verknüpft.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Setzen von Bits auf „1“:&lt;br /&gt;
     01001&amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039;11 Bitfeld&lt;br /&gt;
 OR  00000&amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;00 Bitmaske&lt;br /&gt;
 -------------&lt;br /&gt;
 =   01001&amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;11 Ergebnis&lt;br /&gt;
&lt;br /&gt;
Setzen von Bits auf „0“:&lt;br /&gt;
&lt;br /&gt;
 NOT 0000&amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;000 Bitmaske&lt;br /&gt;
 -------------&lt;br /&gt;
 =   1111&amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039;111 invertierte Bitmaske&lt;br /&gt;
 AND 0100&amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;011 Bitfeld&lt;br /&gt;
 -------------&lt;br /&gt;
 =   0100&amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039;011 Ergebnis&lt;br /&gt;
&lt;br /&gt;
=== Bits umschalten ===&lt;br /&gt;
Sollen einzelne Bits umgeschaltet ({{enS|&amp;#039;&amp;#039;to toggle&amp;#039;&amp;#039;}}) bzw. invertiert werden, setzt man die entsprechenden Stellen in der Bitmaske auf „1“ und alle anderen auf „0“ und verknüpft Bitfeld und Bitmaske über ein [[Kontravalenz|exklusives Oder]].&lt;br /&gt;
&lt;br /&gt;
     01001&amp;#039;&amp;#039;&amp;#039;01&amp;#039;&amp;#039;&amp;#039;1 Information&lt;br /&gt;
 XOR 00000&amp;#039;&amp;#039;&amp;#039;11&amp;#039;&amp;#039;&amp;#039;0 Bitmaske&lt;br /&gt;
 -------------&lt;br /&gt;
 =   01001&amp;#039;&amp;#039;&amp;#039;10&amp;#039;&amp;#039;&amp;#039;1 Ergebnis&lt;br /&gt;
&lt;br /&gt;
=== Bitmasken zusammenfassen ===&lt;br /&gt;
Bitmasken können zusammengefasst werden, um z.&amp;amp;nbsp;B. in einer Operation mehrere Bits auf einmal zu überprüfen oder zu setzen. Dazu addiert man lediglich die einzelnen Bitmasken oder verknüpft sie über ein bitweises Oder.&lt;br /&gt;
&lt;br /&gt;
     0000000&amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039; Bitmaske1&lt;br /&gt;
 OR  000000&amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;0 Bitmaske2&lt;br /&gt;
 -------------&lt;br /&gt;
     000000&amp;#039;&amp;#039;&amp;#039;11&amp;#039;&amp;#039;&amp;#039; zusammengefasste Bitmaske&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Bitkette]]&lt;br /&gt;
* [[Bitfelddiagramm]]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Rechnerarchitektur]]&lt;br /&gt;
[[Kategorie:Assembler]]&lt;/div&gt;</summary>
		<author><name>imported&gt;MovGP0</name></author>
	</entry>
</feed>