É uma espécie de compactação simples, na qual você usa uma variável numérica para armazenar muitos estados booleanos / binários, usando a duplicação e o fato de que todo número de duplicação é 1 + a soma de todos os anteriores.
Tenho certeza de que deve ser uma técnica antiga e bem conhecida. Gostaria de saber como é chamada para se referir a ela corretamente. Fiz várias pesquisas de todas as formas possíveis para descrevê-lo, mas não encontrei nada além de alguns artigos de blog em que os autores do artigo parecem ter descoberto isso por conta própria e também não sabem como chamá-lo ( exemplo 1 , exemplo 2 ).
Por exemplo, aqui está uma implementação muito simples destinada a ilustrar o conceito:
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
}
Você também pode usar operadores bit a bit, análise de número de base 2, enumerações ... Existem muitas maneiras mais eficientes de implementá-lo. Estou interessado no nome da abordagem em geral.
bool
geralmente é armazenado como um inteiro de 32 bits internamente. Como tal, a embalagem pode fazer a diferença de um fator de 32. Isso é realmente muito. Quero dizer, nós programadores estamos sempre prontos para jogar fora metade de nossos recursos, mas geralmente reluto em jogar 97% deles. Esses fatores de desperdício podem facilmente fazer a diferença entre poder executar casos de uso importantes e ficar sem memória.
enums
e eles podem ter umFlags
atributo. Eles poderiam tornar seu código muito mais simples.