Die Boost C++ Bibliotheken

Kapitel 26. Boost.DynamicBitset

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.

Beispiel 26.1. 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.