これは、1つの数値変数を使用して多くのブール値/バイナリ状態を格納する単純な圧縮の一種です。倍増と、倍増数はすべて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
属性を持つことができます。彼らはあなたのコードをはるかに簡単にすることができます。