Frage

Ich lese überall Menschen zu komprimieren Objekte auf einem bitweise Maßstab sprechen. Dinge wie „Die ersten drei Bits repräsentieren so und so, dann die nächsten zwei repräsentieren diese und zwölf Bits für die“

Ich verstehe, warum wäre es wünschenswert, die Speichernutzung zu minimieren, aber ich kann nicht denken Sie an eine gute Möglichkeit, dies zu realisieren. Ich weiß, ich würde es in einer oder mehr ganzen Zahlen packen (oder Long-Positionen, was auch immer), aber ich kann nicht eine einfache Möglichkeit vorstellen, mit ihm zu arbeiten. Es wäre ziemlich cool, wenn es eine Klasse ist, wo ich könnte / beliebigen Bits von einem beliebigen Länge binären Feld gesetzt werden, und es würde die Dinge für mich kümmern, und ich würde nicht gehen, um Ausmisten etwa mit & ‚s und |‘ s und Masken und so weiter.

Gibt es ein Standardmuster für diese Art der Sache?

War es hilfreich?

Lösung

MSDN :

  

BitArray Klasse

     

Leitet eine kompakte Anordnung von Bitwerten, die als Boolesche Werte dargestellt werden, wo die wahre zeigt an, dass das Bit eingeschaltet ist (1) und falsch zeigt das Bit ausgeschaltet ist (0).

Beispiel:

BitArray myBitArray = new BitArray(5);
myBitArray[3] = true; // set bit at offset 3 to 1

BitArray können Sie nur einzelne Bits gesetzt, though. Wenn Sie Werte wollen mit mehr Bits codieren, gibt es wahrscheinlich keinen Weg, um Ausmisten etwa mit & 's und | s und Masken und Material: -)

Andere Tipps

Vielleicht möchten Sie die BitVector32 check out Struktur in .NET Framework. Damit können Sie definieren „Abschnitte“, die Bereiche von Bits innerhalb eines int sind, dann lesen und schreiben Werte auf diese Abschnitte.

Die wichtigste Einschränkung ist, dass es auf eine einzige 32-Bit-Ganzzahl begrenzt ist; dies kann oder kann nicht ein Problem sein, je nachdem, was Sie zu tun versuchen. Wie dtb erwähnt, kann BitArray Bit-Felder jeder Größe verarbeiten, aber man kann nur ein einziges Bit zu einem Zeitpunkt erhalten und eingestellt -. Gibt es keine Unterstützung für die Abschnitte wie in BitVector32

Was Sie suchen bitweise Operationen genannt werden.

Zum Beispiel, sagen wir mal, wir werden einen RGB-Wert in den am wenigsten signifikanten 24 Bits einer ganzen Zahl darstellen, wobei R Bits 23-16, wobei G Bits 15-8 und B sind Bits 7-0.

Sie können R auf einen beliebigen Wert zwischen 0 und 255, ohne die anderen Bits wie folgt bewirkt:

void setR(ref int RGBValue, int newR)
{
  int newRValue = newR << 16; // shift it left 16 bits so that the 8 low-bits are now in position 23-16
  RGBValue = RGBValue & 0x00FF; // AND it with 0x00FF so that the top 16 bits are set to zero
  RGBValue = RGBValue | newRValue;   // now OR it with the newR value so that the new value is set.
}

Durch die Verwendung bitweise UND-Verknüpfung und RUP (und gelegentlich exotischere Operationen) Sie leicht einstellen und sämtliches einzelnes Bit eines größeren Wertes.

Anstatt mit Toolkit oder plattformspezifische Wrapper-Klassen Ich glaube, Sie sind besser dran, die Kugel zu beißen und lernen Sie Ihre & s und | s und 0x04s und wie alle die Bit-Operatoren arbeiten. Im Großen und Ganzen das ist, wie seine für die meisten Projekte durchgeführt, und die Operationen sind extrem schnell. Die Operationen sind ziemlich identisch auf den meisten Sprachen, so dass Sie nicht auf einige spezifische Toolkit abhängig stecken wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top