Es ist einfach, ein bitset<64>
von einem uint64_t
zu erstellen:
Aber gibt es eine gute Möglichkeit, ein bitset<64 * N>
aus einem uint64_t[N]
zu konstruieren, so dass sich flags[0]
auf die niedrigsten 64 Bits bezieht?
Oder muss ich set()
in einer Schleife aufrufen?
std::bitset
hat keinen Bereichskonstruktor, also müssen Sie eine Schleife erstellen, aber jedes Bit einzeln mit std::bitset::set()
zu setzen ist unterkill. std::bitset
unterstützt binäre Operatoren, so dass Sie mindestens 64 Bits in Großbuchstaben setzen können:
Update: In den Kommentaren wirft @icando die berechtigte Sorge auf, dass Bitshifts O (N) -Operationen für std::bitset
s sind. Bei sehr großen Bitsets wird dies letztendlich den Leistungsschub der Massenverarbeitung erleiden. In meinen Benchmarks ist der Break-Even-Punkt für ein std::bitset<N * 64>
im Vergleich zu einer einfachen Schleife, die die Bits einzeln setzt und die Eingabedaten nicht mutiert:
ist irgendwo um N == 200
(gcc 4.9 auf x86-64 mit libstdc ++ und -O2
). Clang schneidet etwas schlechter ab, sogar um N == 160
. Gcc mit -O3
drückt es auf N == 250
.
Am unteren Ende bedeutet dies, dass wenn Sie mit Bitsets von 10000 Bit oder größer arbeiten möchten, dieser Ansatz möglicherweise nicht für Sie geeignet ist. Auf 32-Bit-Plattformen (z. B. Common ARMs) Der Schwellenwert wird wahrscheinlich niedriger liegen. Denken Sie also daran, wenn Sie auf solchen Plattformen mit 5000-Bit-Bitsets arbeiten. Ich würde jedoch argumentieren, dass Sie sich weit vorher schon gefragt haben sollten, ob ein Bitset wirklich die richtige Wahl für einen Container ist.
Wenn die Initialisierung aus dem Bereich wichtig ist, sollten Sie std :: vector
verwendenEs hat Konstruktor aus einem Paar von Iteratoren