Це свого роду просте стиснення, коли ви використовуєте одну числову змінну для зберігання багатьох булевих / двійкових станів, використовуючи подвоєння та той факт, що кожне подвоєне число дорівнює 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
атрибут. Вони можуть зробити ваш код набагато простішим.