ビットマスクは、1バイト内のデータの特定のビットにアクセスするのに使われます。
AUTHOR: Arduino、LAST REVISION: 2022/11/23 23:29
ビットマスクは、1バイト内のデータの特定のビットにアクセスするのに使われます。これは繰り返し方法として有用なことがあります。例えば、1バイトのデータをひとつのピンからシリアルに送信する場合です。この例では、送信するバイト内の各ビットに応じて、ピンの状態をHIGHとLOWに変更する必要があります。これは、ビット単位の演算子とビットマスクを用いて実現されます。
ビット単位の演算子は、ビットレベルで影響を及ぼす論理関数です。標準的なビット単位の演算子には、AND(&)とOR(|)、左シフト(«)、右シフト(»)があります。
AND演算子(&)は、双方の入力の値が1のとき、各ビットの位置が1となります。例えば、
|
|
包含的論理和としても知られるOR演算子(|)は、どちらかの入力の値が1のとき、各ビットの位置が1となります。例えば、
|
|
左シフト演算子(«)は、指定した数だけ元の値を左にシフトします。例えば、
|
|
バイト内の全てのビットが左に一つシフトし、一番左のビットはなくなります。
右シフト演算子(»)は、指定した数だけ元の値を右にシフトすること以外は、左シフト演算子と同じように動作します。
|
|
バイト内の全てのビットが右に一つシフトし、一番右のビットはなくなります。
実用的な例として、170(2進数で10101010)を考えてみましょう。この値を7番ピンにパルスとして出力するコードは、以下のようになります。
|
|
ここでは、ビットマスクの値をループ内で左にシフトしていくことで、forループで繰り返します。この例では<==演算子を使っていますが、«と全く同じで、文を簡潔にします。
|
|
最初のループで出力ピンは0となります。2回目のループでは、mask=00000010なので、演算は以下のようになります。
|
|
その結果、出力ピンは1になります。1が8ビットの終わりから左にシフトされmask=0となるまで、ループはマスクの各ビットを繰り返します。その結果8ビットすべてが送信され、ループを抜けます。
オリジナルのページ
https://docs.arduino.cc/learn/programming/bit-mask
最終更新日
January 28, 2024