PHP ドキュメント JSONについては、Wordのビットマスクについて言及しています。ウィキペディアではマスクとして定義されています。 。専門用語を使用せず、素人の用語を使用してこれらの用語を説明できる人はいますか?
ビットとバイト
計算では、数値は内部的にバイナリで表されます。つまり、変数に整数型を使用する場合、これは実際には内部でゼロと1の合計として表されます。
ご存知かもしれませんが、1ビットは1つの0
または1つの1
。これらのビットの8つの連結は、バイトを表します。 00000101
、これは数字の5です。数字が2進数で表現される方法を知っていると思います。そうでない場合は、 here を見てください。
In PHP数字は(ほとんど)4バイトの長さです。これは、数字が実際に32ビットの内部ストレージを使用することを意味します。
ビットで状態を保存する
ここで、one(true
)またはzero(false
)である複数の値に基づいた状態を保持するプログラムを作成するとします。これらの値をさまざまな変数に格納できます。ブール値または整数の場合があります。 または代わりに単一の整数変数を使用し、内部32ビットの各ビットを使用して、異なる真と偽を表します。
例: 00000101
。ここで、最初のビット(右から左に読む)は真であり、最初の変数を表します。 2番目はfalseで、2番目の変数を表します。 3番目の真実。等々...
これはデータを保存する非常にコンパクトな方法であり、多くの用途があります。
ビットマスキング
これがビットマスキングの出番です。複雑に聞こえますが、実際には非常に簡単です。
ビットマスキングを使用すると、ビットレベルで機能する操作を使用できます。
実際に値にmaskを適用します。この場合、値は状態00000101
そして、マスクは再び2進数であり、対象のビットを示します。
マスクと状態で二項演算を実行することにより、以下を達成できます。
特定の値をtrueに設定したい場合は、OR演算子と次のビットマスクを使用してこれを行うことができます。
Mask: 10000000b
Value: 00000101b
---- OR ---------
Result: 10000101b
または、AND演算子を使用して、状態から特定の値を選択できます。
Mask: 00000100b
Value: 00000101b
---- AND ---------
Result: 00000100b
もっと詳しく見て、専門用語に慣れることをお勧めします。良いスタートは this linkかもしれません。
幸運を!
これは、バイナリで表される単なる数字です。たとえば、保存したい8つのブール値(true
またはfalse
)があるとします。 8つのブール値の配列として格納することも、1バイト(8ビット)として格納することもできます。各バイトにはブール値(_0
_ = false
、_1
_ = true
)。
この時点で、(1)特定のビットをオンまたはオフ(trueまたはfalse)に設定し、(2)特定のビットがオンまたはオフになっているかどうかを確認できるように、バイトを簡単に操作できます。
mask = mask | (1 << bitIndex)
mask = mask & ~(1 << bitIndex)
(mask & (1 << bitIndex)) != 0
_これらの操作はすべて、左シフト演算子を使用します。この演算子は、ビットを最下位から最上位に移動します。
本質的に、ビットマスクは、単一のフィールド(通常は整数)に圧縮されたブールフラグ(isAlive、isMovingなど)のリストです。 JSON文字列サイズまたはメモリフットプリントのかなりの量を削減できます。
これは、特にPHPの場合、配列内の単一のブール値が同じ量のRAM整数となる可能性があります。 非常にシンプルなビットマスクガイド それは、どのように、いつ使用するかを含む、あなたが知る必要があるすべてを段階的に説明します。