組込みでは論理演算をよく使う
論理演算子(シフト、論理和、論理積)
プログラミングの経験の浅い方や、OA処理など組込みでないソフトウェアに携わっておられた方にはなじみのない演算です。しかし組込みソフト、特にハードウェアを制御する部分を作るときには、ほぼ必須として使用するのがこの論理演算子です。そのようなこともあり、今回のマジカルボックスでも敢えて使用しています。
シフト演算子
図2は、8ビットの変数(char型)の中身を2進数で表現したものです。8桁の1または0の列でできています。
たとえば、10進数で「5」は、2進数では00000101です。つまり、C言語で
char temp; temp = 5;
と記述すると、このプログラムが実行されたとき、変数tempの中身は00000101という値になっているわけです。
シフト演算子は、この2進数の1と0でできた列を右に左にずらすときに使います。たとえば、00000101(十進数で5)を左にひとつシフトさせると、図3のようになって、00001010(十進数で10)になります。
さらに、もう一度左に1つシフトすると、図4のようになります。
今度は値が00010100、つまり十進数で20になりました。
なにか気づかれましたか?左に1つするごとに、変数の値は5→10→20と変わっています。つまり、左に1つシフトすることは、値を2倍するのと同じです。もう少し一般的な表現をすると、左にNだけシフトすると、元の値は2のN乗倍されるわけです。逆に、右にシフトをすると元の値は2のN乗分の1になります。
さてC言語では、シフト演算をするときは以下のような演算子を使います。
変数 << シフト量; | 左にシフト量だけシフト |
変数 >> シフト量; | 右にシフト量だけシフト |
temp = temp << 2; 変数tempの値を2つ左にシフトする
大小比較の演算子と似ているので、間違えないように注意しましょう。シフト演算自体は、それほど多用するものではありません。ですが、上記のような2進数での数値表現や演算に慣れておくことは、組込みソフトウェアに付き合っていく上でとても大切です。
それはひとえに、回路が簡単になるからです。
たとえば、8Vと5Vを電圧値として認識するのは大変困難です。一方で、単に電気が来てるか来てないかだけであれば、これを判定するのは容易です(実際は電圧の高低で1か0かを決めている)。
人間が調べる場合で想像してみてください。「コンセントは何ボルトですか」と聞かれれば、回路テスターや電圧計で計測しなければなりません。でも、通電してるかどうかどうかだけであれば、電灯をつないでみれば一目瞭然です。