Die Bibliothek Boost.DynamicBitset bietet mit boost::dynamic_bitset
eine Klasse an, die grundsätzlich genauso verwendet wird wie std::bitset
. Der entscheidende Unterschied ist, dass die Anzahl der Bits bei std::bitset
zur Kompilierung angegeben werden muss, während dies bei boost::dynamic_bitset
zur Laufzeit geschieht.
Um boost::dynamic_bitset
einsetzen zu können, müssen Sie die Headerdatei boost/dynamic_bitset.hpp
einbinden.
boost::dynamic_bitset
in Aktion#include <boost/dynamic_bitset.hpp>
#include <iostream>
int main()
{
boost::dynamic_bitset<> db{3, 4};
db.push_back(true);
std::cout.setf(std::ios::boolalpha);
std::cout << db.size() << '\n';
std::cout << db.count() << '\n';
std::cout << db.any() << '\n';
std::cout << db.none() << '\n';
std::cout << db[0].flip() << '\n';
std::cout << ~db[3] << '\n';
std::cout << db << '\n';
}
boost::dynamic_bitset
ist ein Template, dem Sie bei der Instanziierung keine Parameter übergeben müssen – es werden dann Standardwerte verwendet. Wichtiger sind die Parameter, die Sie dem Konstruktor übergeben. So wird im Beispiel 26.1 ein Konstruktor aufgerufen, der db so initialisiert, dass 3 Bits zur Verfügung stehen. Der zweite Parameter, der dem Konstruktor übergeben wird, initialisiert die Bits. Die Zahl 4 bedeutet, dass von den 3 Bits nur das höchstwertige Bit gesetzt ist – also das Bit ganz links.
Sie können die Anzahl der Bits in einem Objekt vom Typ boost::dynamic_bitset
jederzeit ändern. So steht wie im Beispiel 26.1 zu sehen eine Methode push_back()
zur Verfügung, mit der der Datenstruktur ein Bit hinzugefügt wird. Dieses Bit wird das neue höchstwertige Bit. Der Aufruf von push_back()
im Beispiel führt dazu, dass db vier Bits besitzt, von denen die beiden höchstwertigen Bits gesetzt sind. db speichert die Zahl 12.
Beachten Sie, dass es auch möglich ist, die Anzahl der Bits zu verringern. Die entsprechende Methode, die Sie hierzu aufrufen müssen, heißt resize()
. Je nachdem, welchen Parameter Sie an resize()
übergeben, werden Bits hinzugefügt oder entfernt.
boost::dynamic_bitset
stellt Methoden zur Verfügung, um Daten über die gesamte Datenstruktur abzufragen oder um auf einzelne Bits in der Datenstruktur zuzugreifen. So gibt size()
die Anzahl der Bits zurück und count()
die Anzahl der gesetzten Bits. Während any()
true
zurückgibt, wenn mindestens ein Bit gesetzt ist, gibt none()
true
zurück, wenn kein Bit gesetzt ist.
Um auf einzelne Bits zuzugreifen, verwenden Sie die von Arrays bekannte Syntax. Sie erhalten dann eine Referenz auf eine interne Klasse, die das entsprechende Bit repräsentiert und Methoden anbietet, um das Bit zu bearbeiten. So können Sie zum Beispiel flip()
aufrufen, um ein Bit umzudrehen. Die aus C++ bekannten bitweisen Operatoren wie operator~
stehen ebenfalls zur Verfügung. Letztendlich bietet boost::dynamic_bitset
all das, was von std::bitset
bekannt ist.
Beachten Sie, dass boost::dynamic_bitset
keine Iteratoren anbietet. Auch hier verhält sich boost::dynamic_bitset
wie std::bitset
.