ビットマスキングとは何ですか? 質問する

ビットマスキングとは何ですか? 質問する

私は C プログラミングの初心者ですが、ビット マスキングに遭遇しました。ビット マスキングの一般的な概念と機能は何ですか?

例を挙げて頂けると大変ありがたいです。

ベストアンサー1

マスクは、保持するビットとクリアするビットを定義します。

マスキングとは、値にマスクを適用することです。これは、次の操作によって実現されます。

  • 値のビットのサブセットを抽出するためにビット単位のAND演算を行う
  • 値のビットのサブセットを設定するためにビット単位のOR演算を行う
  • 値のビットのサブセットを切り替えるためにビット単位のXOR演算を行う

以下は、値内のビットのサブセットを抽出する例です。

Mask:   00001111b
Value:  01010101b

値にマスクを適用するということは、最初の (上位) 4 ビットをクリアし、最後の (下位) 4 ビットを保持することを意味します。したがって、下位 4 ビットが抽出されます。結果は次のとおりです。

Mask:   00001111b
Value:  01010101b
Result: 00000101b

マスキングは AND を使用して実装されるため、C では次のようになります。

uint8_t stuff(...) {
  uint8_t mask = 0x0f;   // 00001111b
  uint8_t value = 0x55;  // 01010101b
  return mask & value;
}

かなり一般的な使用例を次に示します。大きなワードから個々のバイトを抽出します。ワードの上位ビットを最初のバイトとして定義します。これには、、&および>>(右シフト) という 2 つの演算子を使用します。32 ビット整数から 4 つのバイトを抽出する方法は次のようになります。

void more_stuff(uint32_t value) {             // Example value: 0x01020304
    uint32_t byte1 = (value >> 24);           // 0x01020304 >> 24 is 0x01 so
                                              // no masking is necessary
    uint32_t byte2 = (value >> 16) & 0xff;    // 0x01020304 >> 16 is 0x0102 so
                                              // we must mask to get 0x02
    uint32_t byte3 = (value >> 8)  & 0xff;    // 0x01020304 >> 8 is 0x010203 so
                                              // we must mask to get 0x03
    uint32_t byte4 = value & 0xff;            // here we only mask, no shifting
                                              // is necessary
    ...
}

上記の演算子の順序を入れ替えて、最初にマスクを実行し、次にシフトを実行できることに注意してください。結果は同じですが、今度は別のマスクを使用する必要があります。

uint32_t byte3 = (value & 0xff00) >> 8;

おすすめ記事