Это своего рода простое сжатие, где вы используете одну числовую переменную для хранения множества логических / двоичных состояний, используя удвоение и тот факт, что каждое удваивающее число равно 1 + сумма всех предыдущих.
Я уверен, что это должна быть старая, хорошо известная техника, я хотел бы знать, как она называется, чтобы правильно на нее ссылаться. Я провел несколько поисков по каждому способу, которым могу придумать, чтобы описать это, но не нашел ничего, кроме некоторых статей в блогах, где авторы статей, кажется, сами это выяснили и тоже не знают, как это назвать ( пример 1 , пример 2 ).
Например, вот очень простая реализация, предназначенная для иллюстрации концепции:
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
}
Вы также можете использовать побитовые операторы, разбор чисел с основанием 2, перечисления ... Есть много более эффективных способов реализовать это, меня интересует название подхода в более общем смысле.
bool
обычно хранится как 32-битное целое число внутри. Таким образом, упаковка может иметь значение в 32 раза. Это действительно много. Я имею в виду, что мы, программисты, всегда готовы выбросить половину наших ресурсов, но я, как правило, не хочу выбрасывать 97% из них. Такие бесполезные факторы могут легко определить разницу между возможностью запуска важных сценариев использования и нехваткой памяти.
enums
, и они могут иметьFlags
атрибут. Они могут сделать ваш код намного проще.