【C言語】ビットマスクで特定のビットを操作する

  • 2019.12.07
  • C
【C言語】ビットマスクで特定のビットを操作する

ビットマスクとは?

組み込みソフトをやっていると、ビット演算が必要なことが多々あります。

たとえば、ペリフェラルのレジスタを書き換えるとき。

Xilinx Uart Lite ドキュメントより

上はxilinxのAXI UART liteのControl Registerです。

Rst Rx FIFOはUARTの受信fifoの中身をリセットするbitですが、ここにアクセスするためには、他のbitの設定は変えず、2bit目だけの設定を変更する必要があります。

つまり、ある特定のbitの設定のみを変えて他bitの設定はそのままにする という操作がよく出てきます。

そこで必要となるのがビットマスクです。

ビットマスクは文字通り、特定のビットに対してのみ操作を行いたいときに使うマスクのことです。

例えば、上の例で考えると0x00000002がビットマスクになります。

ビットマスクの使い方

それでは、具体的にビットマスクをどの様に使うか考えていきます。

特定のビットを操作する

ここでは例として

ビットマスクで指定されたbitを1にセットする関数(bitset())

ビットマスクで指定されたbitを0にする関数(bitclr())

を作ってみます。

複数のビットを操作する

ここまでの例ではある特定のbitのみを操作していましたが、複数のbitを操作することもできます。

これは、一番最初に示したような特定のレジスタフィールドを操作するときに役立ちます。

次のような例を考えます。

16bitのデータのうち、data[12:10]の3bitの領域のみの値を更新します。
このように複数のbitを操作する場合にも、先ほどと同じようにbitmaskを使用します。

今回の場合はビットマスクは0x1C00(16’b0001_1100_0000_0000)となります。
以下に data[12:10] の値を0x6(3’b110)に更新する例を示します。

bitフィールドの更新関数bit_field()の処理について詳しく見てみます。

Cカテゴリの最新記事