コンピュータサイエンスにおいて、マスクまたはビットマスクとは、特にビットフィールドにおけるビット演算に使用されるデータのことです。マスクを使用すると、バイト、ニブル、ワードなどの複数のビットを、単一のビット演算でオンまたはオフに設定したり、オンからオフ(またはその逆)に反転させたりすることができます。マスキングのもう1つの用途は、ベクトル処理における述語演算です。この場合、ビットマスクは、ベクトル内のどの要素演算を実行するか(マスクビットが有効)、どの要素演算を実行しないか(マスクビットがクリア)を選択するために使用されます。
1特定のビットをオンにするには、ビットOR演算を使用できます。これは、個々のビットYに対して、 およびという原理に従います。したがって、ビットがオンになっていることを確認するには、を とともに使用できます。ビットを変更しないには、を とともに使用します。Y OR 1 = 1Y OR 0 = YOR1OR0
例:上位4ビット(ビット4、5、6、7)をマスクし、下位4ビット(ビット0、1、2、3)は変更しない。
1001 0101 1010 0101 または1111 0000 1111 0000 = 1111 0101 1111 0101
0実際には、ビットは「マスクオン」(またはマスクオン)されるよりも「マスクオフ」(またはマスクオン)されることが多い。ビット0を0で1埋めるとAND、結果は常に0、つまりとなる。他のビットを元の状態のままにするには、次のようにで埋めるY AND 0 = 0ことができる。AND1Y AND 1 = Y
例:上位4ビット(ビット4、5、6、7)をマスクし、下位4ビット(ビット0、1、2、3)は変更しない。
1001 0101 1010 0101 および0000 1111 0000 1111 = 0000 0101 0000 0101
ビットマスクを使用すると、他のビットの状態に関係なく、個々のビットの状態を簡単に確認できます。これを行うには、AND上記のようにビット単位で他のすべてのビットをオフにし、その値をと比較します0。値が と等しい場合は0、ビットはオフでしたが、値がそれ以外の値の場合は、ビットはオンでした。この方法の便利な点は、値が実際に何であるかを調べる必要がなく、 ではないことだけを確認すればよいことです0。
例:4ビット目の状態を照会する
1001 1 101 1001 0 101 および 0000 1 000 0000 1 000 = 0000 1 000 0000 0 000
これまでの記事では、ビットをオンにする方法とオフにする方法については説明しましたが、両方を同時に行う方法については説明していません。値が何であるかは実際には重要ではなく、現在の値とは反対にする必要がある場合もあります。これは、XOR(排他的論理和)演算を使用して実現できます。は、奇数個のビットがである場合に限り、XORを返します。したがって、対応する2つのビットがの場合、結果はになりますが、そのうちの1つだけがの場合、結果はになります。したがって、ビットの値を反転するには、それらをで行います。元のビットがの場合、を返します。元のビットがの場合、を返します。また、マスキングはビットセーフであることに注意してください。つまり、と同様に、であるため、マスクされていないビットには影響しません。111011XOR111 XOR 1 = 000 XOR 1 = 1XORY XOR 0 = YOR
例:ビット値の切り替え
10011101 10010101 XOR 00001111 11111111 = 10010010 01101010
ビットのサブセットに任意の1と0を書き込むには、まずそのサブセットに0を書き込み、次に上位ビットを設定します。
レジスタ = (レジスタ & ~ビットマスク) | 値;
レジスタやストレージ内の他のビットを変更せずに、選択したビットだけをコピーする必要がある場合があります。これは、例えば次のように表現できます。
、 または
宛先 = (宛先 & ~ビットマスク) | (ソースとビットマスク);
この例では、ビットマスクは、宛先ビットがそのまま残る場所では0、ソースビットに置き換えられる場所では1となります。
(ソースに挿入されるビットのみが含まれている場合は、&ビットマスクの部分は省略できます。)

C言語などのプログラミング言語では、ビットフィールドは、名前付きブール引数のセットを関数に渡すのに便利な方法です。たとえば、グラフィックスAPIであるOpenGLには、画面やその他のバッファをクリアするコマンドがあります。これは最大4つのバッファ(カラーバッファ、深度バッファ、アキュムレーションバッファ、ステンシルバッファglClear())をクリアできるため、APIの作成者は4つの引数を取るようにすることもできました。しかし、その場合、呼び出しは次のようになります。
glClear ( 1 , 1 , 0 , 0 ); // これは実際の glClear の動作とは異なり、不安定なコードになります。これはあまり説明的ではありません。代わりに、4 つの定義済みフィールドビット、、、、GL_COLOR_BUFFER_BITがGL_DEPTH_BUFFER_BITありGL_ACCUM_BUFFER_BIT、GL_STENCIL_BUFFER_BITはglClear()次のように宣言されます。
void glClear ( GLbitfield bits );すると、関数呼び出しは次のようになります。
glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );内部的には、このようなビットフィールドを受け取る関数は、バイナリを使用してand個々のビットを抽出できます。たとえば、の実装はglClear()次のようになります。
void glClear ( GLbitfield bits ) { if (( bits & GL_COLOR_BUFFER_BIT ) != 0 ) { // カラーバッファをクリアします。} if (( bits & GL_DEPTH_BUFFER_BIT ) != 0 ) { // デプスバッファをクリアします。} if (( bits & GL_ACCUM_BUFFER_BIT ) != 0 ) { // アキュムレーションバッファをクリアします。} if (( bits & GL_STENCIL_BUFFER_BIT ) != 0 ) { // ステンシルバッファをクリアします。} }このアプローチの利点は、関数引数のオーバーヘッドが減少することです。最小データサイズが 1 バイトであるため、オプションを個別の引数に分けると、引数ごとに 7 ビットが無駄になり、スタック領域を多く占有することになります。代わりに、関数は通常、それぞれ最大 32 ビットのオプションを持つ 1 つ以上の 32 ビット整数を受け入れます。このソリューションは洗練されていますが、最も単純な実装では型安全ではありません。AGLbitfieldは単に として定義されているため、コンパイラはまたはunsigned intへの意味のない呼び出しを許可します。C ++では、glClear が受け入れる引数のセットをカプセル化するクラスを作成し、ライブラリにきれいにカプセル化することができます。glClear(42)glClear(GL_POINTS)
マスクは、IP ACL (アクセス制御リスト) で IP アドレスとともに使用され、許可および拒否する内容を指定します。インターフェイスに IP アドレスを設定する場合、マスクは 255 から始まり、左側に大きな値を持ちます。たとえば、IP アドレス203.0.113.129に255.255.255.224 のマスクを設定します。IP ACL のマスクは逆になります。たとえば、マスク0.0.0.255です。これは、逆マスクまたはワイルドカードマスクと呼ばれることもあります。マスクの値をバイナリ (0 と 1) に分解すると、トラフィックの処理で考慮されるアドレス ビットが決定されます。0ビットは、アドレス ビットを考慮する必要があること (完全一致) を示し、マスクの1ビットは無視されます。
例えば、ネットワークアドレス(処理対象のトラフィック):192.0.2.0マスク付き:0.0.0.255。バイナリでは、アドレスは11000000.00000000.00000010.00000000、マスクはです00000000.00000000.00000000.11111111。
バイナリマスクに基づくと、最初の 3 つのセット (オクテット) は、指定されたバイナリ ネットワーク アドレス ( ) と完全に一致する必要があることがわかります11000000.00000000.00000010。最後の数値のセットはマスクによって無視されます。したがって、「 」で始まるすべてのトラフィックが一致します。そのため、このマスクでは、 ( )までの192.0.2.ネットワーク アドレスが処理されます。192.0.2.1192.0.2.255192.0.2.x
通常のマスクを減算することで、255.255.255.255ACLの逆マスクが決定されます。この例では、198.51.100.0通常のマスクが次のネットワークアドレスに対して逆マスクが決定されます255.255.255.0。
255.255.255.255 − 255.255.255.0 = 0.0.0.255 (通常マスク)(反転マスク)
source/source-wildcard は「任意の」を意味します。0.0.0.0/255.255.255.255
ソース/ワイルドカードは「ホスト」と同じです198.51.100.2/0.0.0.0198.51.100.2

コンピュータグラフィックスでは、特定の画像を背景の上に配置する場合、バイナリマスクを使用して透明領域を指定できます。[ 1 ]この方法では、各画像に対して実際には 2 つのビットマップがあります。1 つは実際の画像で、未使用領域にはすべてのビットが0 に設定されたピクセル値が割り当てられます。もう 1 つは追加のマスクで、対応する画像領域にはすべてのビットが 0 に設定されたピクセル値が割り当てられ、周囲の領域にはすべてのビットが 1 に設定された値が割り当てられます。右のサンプルでは、黒いピクセルはすべて 0 ビット、白いピクセルはすべて 1 ビットです。
実行時に、背景の上に画像を表示するために、プログラムはまず、ビットごとのAND演算を使用して、目的の座標にある画面ピクセルのビットを画像マスクでマスクします。これにより、透明な領域の背景ピクセルが保持され、重ね合わせた画像によって隠されるピクセルのビットがゼロにリセットされます。
次に、プログラムはビットごとのOR演算を用いて、画像ピクセルのビットと背景ピクセルのビットを結合することで、画像ピクセルのビットをレンダリングします。こうすることで、背景ピクセルを保持したまま、画像ピクセルが適切な位置に配置されます。結果として、背景の上に画像が完全に合成されます。

この手法は、ポインティングデバイスのカーソル描画、典型的な2Dビデオゲームにおけるキャラクター、弾丸などの描画(スプライト)、GUIアイコン、ビデオタイトルやその他の画像合成アプリケーションなどに使用されます。より高速な方法は、アルファ値が1の場合に背景ピクセルを前景ピクセルで単純に上書きすることです。
同じ目的で使用されるため関連性はあるものの、透明色とアルファチャンネルは、バイナリマスキングによる画像ピクセルの混合を伴わない技術である。
ハッシュテーブル用のハッシュ関数を作成する場合、多くの場合、大きなドメインを持つ関数が使用されます。関数の出力からインデックスを作成するには、モジュロ演算を使用してドメインのサイズを配列のサイズに合わせることができます。ただし、多くのプロセッサでは、ハッシュテーブルのサイズを2のべき乗に制限し、代わりにビットマスクを使用する方が高速な場合が多いです。
C言語における剰余演算とマスキングの例:
#include <stdint.h> #include <stdlib.h> #include <string.h>// ハッシュ関数uint32_t hashFunction ( char * token , size_t len , uint32_t bucketCount );int main ( void ) { const uint32_t NUM_BUCKETS = 0xFFFFFFFF ; // 2^32 - 1 const uint32_t MAX_RECORDS = 1 << 10 ; // 2^10 const uint32_t HASH_BITMASK = 0x3FF ; // 2^10 - 1 const size_t TOKEN_COUNT = 100 ; // 例のサイズchar * tokens [] = ( char ** ) malloc ( sizeof ( char * ) * TOKEN_COUNT ); // トークンのメモリ割り当てを処理...char token [] = "何らかのハッシュ可能な値" ; uint32_t hashedToken = hashFunction ( token , strlen ( token ), NUM_BUCKETS );// モジュロ演算を使用: size_t index = hashedToken % MAX_RECORDS ;// または、ビットマスクを使用する場合:size_t index = hashedToken & HASH_BITMASK ;トークン[インデックス] =トークン;// トークンからメモリを解放する... free ( tokens ); return 0 ; }