Konstruiere das Bitset aus einem Array von ganzen Zahlen

8

Es ist einfach, ein bitset<64> von einem uint64_t zu erstellen:

%Vor%

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?

%Vor%

Oder muss ich set() in einer Schleife aufrufen?

    
Barry 27.04.2015, 17:21
quelle

2 Antworten

9

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:

%Vor%

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:

%Vor%

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.

    
Wintermute 27.04.2015, 17:33
quelle
-1

Wenn die Initialisierung aus dem Bereich wichtig ist, sollten Sie std :: vector

verwenden

Es hat Konstruktor aus einem Paar von Iteratoren

    
Severin Pappadeux 27.04.2015 17:41
quelle

Tags und Links