2016-05-18 5 views
4

ich mit einigen Daten arbeiten, wird es als eine Folge von Bits dargestellt,
Nummer (378), von denen durch 8 teilbar istWie speichere ich Array von Bits der Größe, z. B. Größe% 8! = 0?

Was mögliche Wege mit einer solchen Sequenz zu arbeiten sind?
Ich muss es speichern, verarbeiten, eine Sequenz an die andere anhängen.

Optionen Ich betrachtet:

  1. Aufrundung auf die nächste Zahl% 8 == 0 und Array von Zeichen dieser Größe verwenden.
  2. Verwendung bitfield, soweit ich weiß Speicherausrichtung für bitfield ist die Implementierung definiert.

Update:
Eigenschaften von Bitfolgen mit denen ich arbeite:
es ein Codewort, das aus dem gegebenen Wort erzeugt wird, unter Verwendung von Reed-Solomon-Codierungsalgorithmus.
Da ich mit Bits als unabhängige Werte arbeiten kann, ist es für mich nicht sinnvoll, CodeWörter zu speichern und ein neues CodeWord an die vorhandenen anzuhängen, da ich Interleaving Matrix erzeuge, um den Effekt von Burst-Fehlern zu reduzieren

+0

Wird das Hinzufügen üblich sein? Welche Art von Anfragen an Sie in der Verarbeitung? – harold

+0

Option 1 klingt gut. Machst du dir Sorgen darüber, Erinnerungen zu verschwenden? Die verschwendeten Füllbits würden nur etwa 1,5% des verwendeten Speicherplatzes ausmachen. – samgak

Antwort

-1

Es gibt mehrere Möglichkeiten, eine Bitfolge in C++ darzustellen.

One, für Sequenzen mit einer festen Größe bestimmt sind, ist std::bitset:

// Create array 
std::bitset<378> bitArray; 
// Access a bit 
bitArray[14] = 1; 
// Check whether a bit is set 
if (bitArray.test(14)) 

Wenn Sie dynamisch veränderbare Sequenzen benötigen, sollten Sie std::vector betrachten. Wenn die Speichergröße wichtig ist und ein gewisser Zeitaufwand für die Zugriffszeit kein Problem darstellt, sollten Sie std::vector<bool> in Betracht ziehen, was vom Standard garantiert wird, um jedes bool als einzelnes Bit in einem dicht gepackten Array zu speichern.

enum Bit : unsigned char 
{ 
    Zero = 0, One = 1 
} 
std::vector<Bit> bitArray; 
+0

Können Sie einen groben Überblick darüber geben, wie Sie ein Bitset an ein anderes anhängen? – user2079303

+0

@ user2079303 'std :: bitset' hat eine feste Größe: es ist ein Array von Bits. Sie müssten solche Funktionalität selbst programmieren. – Angew

+1

@ user2079303 ["Verketten boost :: dynamic_bitset oder std :: bitset"] (http://stackoverflow.com/questions/3061721/concatenate-boostdynamic-bitset-or-stdbitset) – HostileFork

0

Eine weitere Option ist, std :: vector zu verwenden:

Wenn Sie nicht über die Verpackung dicht ist es egal, können Sie auch Ihre eigene Bit Aufzählung (oder nur char verwenden) definieren. Der std :: vector des Typs bool ist auf bool spezialisiert, um nur ⌈v.size()/8⌉ Bytes zu verwenden. Aber ich sage nicht, dass du das benutzen solltest. Diese Spezialisierung ist der Grund, v.begin() ist nicht nur ein roher Zeiger, aber einige typabhängige Iterator. In allen anderen Fällen ist v.begin() eines Vektors immer ein Zeiger auf das Element.

Wenn die Länge des Bitarrays sehr lang ist, aber Sie erwarten, dass nur sehr wenige Bits gesetzt werden, sollten Sie auch concider verwenden, um stattdessen die Indizes der Bits zu verwenden, die wahr sein sollen.