Es ist eine Art einfache Komprimierung, bei der Sie eine numerische Variable verwenden, um viele boolesche / binäre Zustände zu speichern. Dabei wird die Verdopplung verwendet und jede Verdopplungszahl ist 1 + die Summe aller vorherigen.
Ich bin sicher, es muss eine alte, bekannte Technik sein. Ich würde gerne wissen, wie sie heißt, um richtig darauf zu verweisen. Ich habe mehrere Suchanfragen durchgeführt, um es zu beschreiben, aber nichts anderes als einige Blog-Artikel gefunden, bei denen die Artikelautoren dies anscheinend selbst herausgefunden haben und nicht wissen, wie sie es nennen sollen ( Beispiel 1 , Beispiel 2 ).
Zum Beispiel ist hier eine sehr einfache Implementierung, um das Konzept zu veranschaulichen:
packStatesIntoNumber () {
let num = 0
if (this.stateA) num += 1
if (this.stateB) num += 2
if (this.stateC) num += 4
if (this.stateD) num += 8
if (this.stateE) num += 16
if (this.stateF) num += 32
return num
}
unpackStatesFromNumber (num) {
assert(num < 64)
this.stateF = num >= 32; if (this.stateF) num -= 32
this.stateE = num >= 16; if (this.stateE) num -= 16
this.stateD = num >= 8; if (this.stateD) num -= 8
this.stateC = num >= 4; if (this.stateC) num -= 4
this.stateB = num >= 2; if (this.stateB) num -= 2
this.stateA = num >= 1; if (this.stateA) num -= 1
}
Sie könnten auch bitweise Operatoren verwenden, das Parsen von Zahlen zur Basis 2, Aufzählungen ... Es gibt viel effizientere Möglichkeiten, dies zu implementieren. Ich interessiere mich für den Namen des Ansatzes im Allgemeinen.
quelle
enums
und sie können einFlags
Attribut haben. Sie könnten Ihren Code viel einfacher machen.bool
wird im Allgemeinen intern als 32-Bit-Ganzzahl gespeichert. Daher kann das Packen den Faktor 32 ausmachen. Das ist wirklich eine Menge. Ich meine, wir Programmierer sind immer bereit, die Hälfte unserer Ressourcen wegzuwerfen, aber ich zögere im Allgemeinen, 97% davon wegzuwerfen. Derartige Verschwendungsfaktoren können leicht den Unterschied zwischen der Ausführung wichtiger Anwendungsfälle und Speichermangel ausmachen.Antworten:
Es wird am häufigsten als Bitfeld bezeichnet , und ein anderer Begriff, den Sie häufig hören, sind Bitmasken , mit denen einzelne Bitwerte oder das gesamte Bitfeld auf einmal abgerufen oder festgelegt werden.
Viele Programmiersprachen haben dazu Hilfsstrukturen. Wie @BernhardHiller in den Kommentaren festhält, enthält C # Aufzählungen mit Flags . Java hat die EnumSet- Klasse.
quelle
BitArray
können beliebig viele Bits gespeichert und indiziert werden (während Flags auf einen Integer-Typ beschränkt sind und als Masken verwendet werden sollen).Seltsame, ziemlich unterschiedliche Begriffe, aber ich sehe keinen, der mir sofort in den Sinn gekommen ist (und das steht im Titel Ihrer Frage!) - Bit-Packing ist das, was ich schon immer gehört habe.
Ich hatte gedacht, dass dies wirklich offensichtlich ist, aber seltsamerweise, wenn ich es google, scheint es ein Begriff zu sein, der weit verbreitet, aber nicht offiziell definiert ist Prozess). Das Suchen nach der Definition scheint zu dieser Seite zu führen:
http://www.kinematicsoup.com/news/2016/9/6/data-compression-bit-packing-101
Was für SO-Zwecke nicht besonders gut ist, aber die beste Definition / Beschreibung ist, die ich finden kann, einschließlich dieser kurzen Beschreibung: "Bit-Packing ist ein einfaches Konzept: Verwenden Sie so wenig wie möglich, um Daten zu speichern."
quelle
char
Array zu komprimieren, indem zweichar
s in eins gesetzt werdenint
.Es gibt viele verschiedene Begriffe, die verwendet werden, um dies zu beschreiben.
Am häufigsten werden die Bits "Bitflags" oder "Bitfelder" genannt.
(Es ist jedoch anzumerken, dass sich "Bitfelder" manchmal auf ein bestimmtes Merkmal der Sprachen C und C ++ beziehen, das zwar verwandt ist, aber nicht genau dasselbe.)
Die ganze Zahl selbst wird je nach Verwendung und Umständen auf verschiedene Weise entweder als "Bit-Array", "Bit-Set" oder "Bit-Vektor" bezeichnet.
In beiden Fällen erfolgt das Extrahieren der Bits aus der Bitmenge / dem Vektor / dem Array durch Verschieben und Maskieren.
(dh mit einer Bitmaske .)
Für einige Beispiele für jeden aktiven Begriff:
std::bitset
BitSet
BitArray
bitvector
,bitarray
undbitset
bitarray
Projekt und einBitVector
ProjektEs ist nicht wirklich relevant für die Frage, aber ich möchte sagen: Bitte verwenden Sie Addition und Subtraktion nicht, um Bits zu setzen und zu löschen, da diese Methoden fehleranfällig sind.
(Wenn Sie dies
num += 1
zweimal tun , entspricht das Ergebnisnum += 2
.)Verwenden Sie stattdessen lieber die entsprechenden bitweisen Operationen, wenn Ihre gewählte Sprache diese bereitstellt:
quelle
this.stateF = (num & 32) ? true : false
usw. Sie müssen nicht mutieren,num
während Sie die Werte extrahieren.+
und reagiert-
. Ich habe jetzt eins besser gemacht und!= 0
anstelle eines Ternären verwendet, was meiner Meinung nach prägnanter ist, während ich noch expclit bin.