Jest to rodzaj prostej kompresji, w której używasz jednej zmiennej numerycznej do przechowywania wielu stanów logicznych / binarnych, wykorzystując podwojenie oraz fakt, że każda liczba podwojenia to 1 + suma wszystkich poprzednich.
Jestem pewien, że to musi być stara, dobrze znana technika. Chciałbym wiedzieć, jak się nazywa, aby się do niej poprawnie odwoływać. Przeprowadziłem kilka wyszukiwań pod każdym względem, który mogę wymyślić, aby to opisać, ale nie znalazłem nic poza niektórymi artykułami na blogu, w których autorzy artykułu sami się zorientowali i nie wiedzą, jak to nazwać ( przykład 1 , przykład 2 ).
Na przykład oto bardzo prosta implementacja mająca zilustrować tę koncepcję:
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
}
Możesz także użyć operatorów bitowych, parsowania liczb 2, wyliczeń ... Istnieje wiele bardziej wydajnych sposobów implementacji, interesuje mnie nazwa tego podejścia bardziej ogólnie.
bool
jest ogólnie przechowywany wewnętrznie jako 32-bitowa liczba całkowita. Dlatego pakowanie może mieć znaczenie 32-krotne. To naprawdę dużo. To znaczy, my programiści zawsze jesteśmy gotowi wyrzucić połowę naszych zasobów, ale generalnie niechętnie wyrzucam 97% z nich. Takie czynniki marnotrawstwa mogą łatwo zrobić różnicę między możliwością uruchamiania ważnych przypadków użycia a brakiem pamięci.
enums
i mogą miećFlags
atrybut. Mogą znacznie uprościć kod.