Es una especie de compresión simple en la que utiliza una variable numérica para almacenar muchos estados booleanos / binarios, utilizando la duplicación y el hecho de que cada número de duplicación es 1 + la suma de todos los anteriores.
Estoy seguro de que debe ser una técnica antigua y bien conocida, me gustaría saber cómo se llama para referirme a ella correctamente. Hice varias búsquedas en todas las formas en que puedo pensar para describirlo, pero no encontré nada más allá de algunos artículos de blog en los que los autores del artículo parecen haberlo descubierto ellos mismos y tampoco saben cómo llamarlo ( ejemplo 1 , ejemplo 2 ).
Por ejemplo, aquí hay una implementación muy simple destinada a ilustrar el concepto:
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
}
También podría usar operadores bit a bit, análisis de números de base 2, enumeraciones ... Hay muchas maneras más eficientes de implementarlo, estoy interesado en el nombre del enfoque en general.
bool
generalmente se almacena internamente como un entero de 32 bits. Como tal, el embalaje puede marcar la diferencia de un factor de 32. Eso es realmente mucho. Quiero decir, los programadores siempre estamos listos para tirar la mitad de nuestros recursos, pero generalmente soy reacio a tirar el 97% de ellos. Tales factores de desperdicio pueden hacer fácilmente la diferencia entre poder ejecutar casos de uso importantes y quedarse sin memoria.
enums
, y pueden tener unFlags
atributo. Podrían hacer que su código sea mucho más simple.