Bu, iki boolean / binary durumunu saklamak için bir sayısal değişkeni kullandığınız, iki katlamayı ve iki kat sayıların önceki sayıların toplamının 1 + olduğu gerçeğini kullanan basit bir sıkıştırma türüdür.
Eski, iyi bilinen bir teknik olması gerektiğine eminim, doğru bir şekilde neyi kastedildiğini bilmek istiyorum. Tarif etmeyi düşündüğüm her yolla ilgili birçok araştırma yaptım, ancak makale yazarlarının bunu kendilerinin çözdüğü ve ne diyeceğini bilemedikleri bazı blog makalelerinin ötesinde hiçbir şey bulamadım ( örnek 1 , örnek 2 ).
Örneğin, işte kavramı göstermek için çok basit bir uygulama:
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
}
Ayrıca bitsel operatörleri, baz 2 sayı ayrıştırma, numaralandırmaları kullanabilirsiniz. Uygulamanın daha verimli yolları var, daha genel olarak yaklaşımın adıyla ilgileniyorum.
bool
genellikle dahili olarak 32 bit tam sayı olarak saklanır. Bu nedenle, paketleme 32 faktörünün farkını yaratabilir. Bu gerçekten çok fazla. Demek istediğim, biz programcılar kaynaklarımızın yarısını atmaya her zaman hazırız, ancak genellikle bunların% 97'sini atmak konusunda isteksizim. Bu tür atık faktörleri, önemli kullanım durumlarını çalıştırabilmek ve hafızasının tükenmesi arasında kolayca fark yaratabilir.
enums
ve birFlags
öznitelik olabilir. Kodunuzu çok daha kolay hale getirebilirler.