01011010C言語ではこの4つのビット演算を使用することができます。これらを使ってレジスタの特定のビットのみの抽出などを行っていきます。レジスタの例として、atmega328PのポートBの状態(HIGHかLOWか)を設定するレジスタを使ってみたいと思います。Atmega328Pのデータシート(https://avr.jp/user/DS/PDF/mega328P.pdf)のページ65の図の部分より、ポートBの出力状態を切り替えるレジスタは”PORTB”であることがわかります。続いて下部のビットの一覧部を拡大します。制御、ビット1はPB1の状態を制御...といったようになっており、各ビットに0を入れると対応するポートがLOW、1を入れると対応するポートがHIGHになります。このように、1つのレジスタでPB0からPB7までの8つのピン(厳密にはPB6とPC7はたいてい水晶を接続するので6ピンになることが多い)の状態を制御する仕様になっていることがわかると思います。そのため、1つのピンのみを制御しようとして、レジスタに直接値を入力するとPB0からPB7までのすべての状態が変わってしまい不都合が生じてしまいます。ここで必要なのがビット演算というわけです。特定のビットのみを操作したいときは、現在のレジスタの状態と操作するビットが立てられた(1にされた)値をビット演算で比較をします。現在のレジスタの状態はデータシートのビット一覧(上の図)のアクセス種別の表記より読み込みが可能であることがわかります。そのためこのような処理が可能というわけです。特定のポート(ビット)のみを操作する方法を、例を使って紹介していきたいと思います。それぞれ操作する前の状態はわからない(テキトーな値)になっているとします。PB4をHIGHにしたいとき(ビット4のみを1にする)現在の状態に操作するビットを立てた(1にした)値をORします。→PORTBこのようにすると元の状態が何であったとしても操作したいビットが確実に1に設定され、ほかのビットは何も影響を受けないことがわかると思います。これをC言語で省略せずに記述するとこのようになります。0b00010000;ですが、操作するビットを2進数(プログラムでは”0b****”で示す)書いていては入力が大変で、読みにくいです。そのためこれを16進数(プログラムでは”0x**”で示す)に変換します。C言語での省略表記も合わせて使うとこのようになります。0x10;先ほどの書き方に比べてとてもスマートになりますね。基本的にはこの書き方を使っていきたいと思います。PB4のみをLOWにしたいとき(ビット4のみを0にする)操作するビットを立てた(1にした)値にNOTをかけて反転させた値と現在の状態をANDします。→PORTBこうすることで、操作したいビットが確実に0になり、ほかのビットは影響を受けません。~0x10;と表せます。PB4のみ状態を入れ替える(ビット4が1だった場合0、0だった場合1にする)現在の状態と操作するビットを立てた(1にした)値のXORをかけます。→PORTBこのようにすると操作したいビットの状態が入れ替わり、ほかのビットは影響を受けません。0x10;と表せます。レジスタの特定のビットのみを操作するときは基本的にはこの3つを使うことが多いと思います。ビット演算ではほかにも特定のビットのみを取り出したいときにANDを使うときもあります。方法としては元の値に取り出したいビットを立てた(1にした)値をANDします。元の値から下4ビットのみを取り出す場合はこのようにします。00001010このようにすると上4ビットはすべて0で下4ビットは元の値がそのまま取り出せることがわかります。C言語で書くと以下のようになります。0x0F;と表せます。(元の値がレジスタであったり、元の値を保持することが多いので、”A&=0x0F;”と書くことは少ないです。)この方法はマイコンのレジスタから値を取り出す際や通信の際によく使う手法です。ビット演算は以上として次回はビットシフトのお話をしたいと思います。