web-dev-qa-db-ja.com

ビットマスクとマスクとは何ですか?

PHP ドキュメント JSONについては、Wordのビットマスクについて言及しています。ウィキペディアではマスクとして定義されています。 。専門用語を使用せず、素人の用語を使用してこれらの用語を説明できる人はいますか?

31
Robert Rocha

ビットとバイト

計算では、数値は内部的にバイナリで表されます。つまり、変数に整数型を使用する場合、これは実際には内部でゼロと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進数であり、対象のビットを示します。

マスクと状態で二項演算を実行することにより、以下を達成できます。

  • AND演算子は、状態のビットのサブセットを抽出します
  • OR演算子は、状態のビットのサブセットを設定します
  • XOR演算子は、状態のビットのサブセットを切り替えます

特定の値をtrueに設定したい場合は、OR演算子と次のビットマスクを使用してこれを行うことができます。

Mask:   10000000b
Value:  00000101b
---- OR ---------
Result: 10000101b

または、AND演算子を使用して、状態から特定の値を選択できます。

Mask:   00000100b
Value:  00000101b
---- AND ---------
Result: 00000100b

もっと詳しく見て、専門用語に慣れることをお勧めします。良いスタートは this linkかもしれません。

幸運を!

68
DJanssens

これは、バイナリで表される単なる数字です。たとえば、保存したい8つのブール値(trueまたはfalse)があるとします。 8つのブール値の配列として格納することも、1バイト(8ビット)として格納することもできます。各バイトにはブール値(_0_ = false、_1_ = true)。

この時点で、(1)特定のビットをオンまたはオフ(trueまたはfalse)に設定し、(2)特定のビットがオンまたはオフになっているかどうかを確認できるように、バイトを簡単に操作できます。

  • ビットを1に設定するには:mask = mask | (1 << bitIndex)
  • ビットを0に設定するには:mask = mask & ~(1 << bitIndex)
  • ビットを取得するには(チェックできるように):_(mask & (1 << bitIndex)) != 0_

これらの操作はすべて、左シフト演算子を使用します。この演算子は、ビットを最下位から最上位に移動します。

13
Jashaszun

本質的に、ビットマスクは、単一のフィールド(通常は整数)に圧縮されたブールフラグ(isAlive、isMovingなど)のリストです。 JSON文字列サイズまたはメモリフットプリントのかなりの量を削減できます。

これは、特にPHPの場合、配列内の単一のブール値が同じ量のRAM整数となる可能性があります。 非常にシンプルなビットマスクガイド それは、どのように、いつ使用するかを含む、あなたが知る必要があるすべてを段階的に説明します。

4
Astrus