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.
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.
enums
und sie können einFlags
Attribut haben. Sie könnten Ihren Code viel einfacher machen.