È una sorta di semplice compressione in cui usi una variabile numerica per memorizzare molti stati booleani / binari, usando il raddoppio e il fatto che ogni numero raddoppiato è 1 + la somma di tutti i precedenti.
Sono sicuro che deve essere una vecchia tecnica ben nota, mi piacerebbe sapere come si chiama per riferirsi ad esso correttamente. Ho fatto diverse ricerche su tutti i modi in cui mi viene in mente di descriverlo, ma non ho trovato nulla oltre ad alcuni articoli del blog in cui gli autori dell'articolo sembrano averlo capito da soli e non sanno nemmeno come chiamarlo ( esempio 1 , esempio 2 ).
Ad esempio, ecco un'implementazione molto semplice intesa a illustrare il concetto:
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
}
Potresti anche usare operatori bit per bit, analisi dei numeri di base 2, enum ... Ci sono molti modi più efficienti per implementarlo, mi interessa il nome dell'approccio più in generale.
bool
viene generalmente memorizzato come numero intero a 32 bit internamente. Pertanto, l'imballaggio può fare la differenza di un fattore 32. È davvero molto. Voglio dire, noi programmatori siamo sempre pronti a buttare via metà delle nostre risorse, ma sono generalmente riluttante a buttare via il 97% di esse. Tali fattori di spreco possono facilmente fare la differenza tra la capacità di eseguire casi d'uso importanti e l'esaurimento della memoria.
enums
e possono avere unFlags
attributo. Potrebbero rendere il tuo codice molto più semplice.