記事のミス等のお問い合わせはTwitterにてお願いします。マイコンで使うビット演算カテゴリ:工作の基礎マイコン前回はマイコンのハードウェアの設計のお話をしましたが、今回からはマイコンのプログラミングについて書いていきたいと思います。マイコンのレジスタを叩く際に必須と言えるビット演算のお話をしたいと思います。マイコンをはじめとするコンピュータの世界はデジタル、つまり0と1しかない世界です。マイコンも例外ではなく大量の0と1の組み合わせで動いています。コンピュータの世界では1つの0か1のデータを1ビット、これを8つ組み合わせたものを1バイトと呼びます。1バイト=8ビットというわけです。一般的にはビットはコンピュータのビット数(パソコンだと32ビットだとか64ビットとか言いますね)やシリアル系の通信速度(wifiとかLANの通信速度の〇〇bpsといいますね)で使われて、バイトは容量系の単位(RAM16GBとかROM64GBとかいいますね)に使われることが多いです。前置きはこの程度にしておきます。マイコンには変数などで使われる通常のメモリのほかに、レジスタという特殊なメモリ領域があります。このレジスタを使ってマイコンに搭載された機能である入出力などを操作します。今回使用するマイコンは8ビットのAVRマイコンなのでレジスタは基本的に8ビットになっています。ポートの出力状態を設定するレジスタにおいても最大8つのポートごとにレジスタが割り当てられているのです。このうち1つのポートだけを操作したい場合などに必要な概念がビット演算というわけです。ビット演算の基礎の基礎としてまずは論理演算を紹介します。”A∩B"などとなります。掛け算なので入力にどれか1つでも0があった場合は出力が0となります。0と1をANDすると出力は0、1と1をANDすると出力は1となります。C言語のプログラムでは“&&”と表します。”A∪B”などとなります。足し算なので入力にどれか1つでも1があった場合は出力が1となります。0と1をORすると出力は1、0と0をORすると出力は0となります。C言語のプログラムでは“||”と表します。NOT(否定)NOTは否定ともいえ、日本語で言うと「Aではない」、論理式で表すと”Ā”などと表します。0が入力された場合は1が出力され、1(0以外)が入力されると0が出力されます。入力に対して出力が反転されるので、論理回路では反転を意味する”inverter”とも言われます。C言語のプログラムではでは”!”と表します。NAND(否定論理積)NANDはANDの出力にNOTをかけたものです。掛け算の否定なので入力にどれか1つでも0があった場合は出力が1となります。0と1をNANDすると出力は1、1と1をNANDすると出力は0となります。C言語ではANDしたあとにNOTをかけて「例えば:!(A&&B)」実行します。論理回路ではよく使われますが、マイコンのプログラムの場合は使う機会は少ないかもしれないです。(特定のビットを0にするために入力にNOTをかけてからANDすることは多いですが...)NOR(否定論理和)NORはORの出力にNOTをかけたものです。足し算の否定なので入力にどれか1つでも1があった場合は出力が0となります。0と1をNORすると出力は0、0と0をNORすると出力は1となります。C言語ではORしたあとにNOTをかけて「例えば:!(A||B)」実行します。NANDと同じく論理回路ではよく使われますが、マイコンのプログラムの場合は使う機会は少ないかもしれないです。XOR(排他的論理和)XORは排他的論理和と言われる、少し変わった論理演算です。入力の1の数が奇数の時に1を出力し、1の個数が偶数の時に0を出力します。こちらは論理回路では使う機会が比較的少ないですが、マイコンのプログラムではそこそこ使います。以上の6つが論理演算ではよく使われてます。基本的には前半の3つであるAND、OR、NOTですべての論理演算が可能です。NANDとNORの2つでもすべての論理演算が可能です。次に今回の本題であるビット演算のお話をしたいと思います。ビット演算では先ほどまで紹介した論理演算をビット単位で行います。ビット単位でのビット演算を考えるため、まずは演算を行う数値を2進数で表します。2進数表記した値を1桁ずつ論理演算するとビット演算になります。AND、OR、NOT、XORのプログラミングにおける記号とビット演算するとどのようになるかを紹介します。