マイコンおよび通信系を行う上で必要となるビット演算の話
2進数、16進数の概念も必要なので確認のこと(
2進数と16進数)
特に必要となるのはこの3つ
AND
OR
NOT
AND(および)
2つの入力が共に1の場合のみ1、それ以外は0
0 and 0 → 0
1 and 0 → 0
0 and 1 → 0
1 and 1 → 1
論理演算での使用例
if( (A==B)
&& (C==D) ) → (AとBが一致)
AND (CとDが一致)
OR(または)
2つの入力のうち片方でも1の場合は1、両方0の場合のみ0
0 and 0 → 0
1 and 0 → 1
0 and 1 → 1
1 and 1 → 1
論理演算での使用例
if( (A==B) || (C==D) ) ( AとBが一致) OR (CとDが一致)
※「|」記号はShift+¥で入力する。
NOT
1つの入力に対する演算。入力が0の時出力1、入力が1の時出力0
NOT 0 → 1
NOT 1 → 0
論理演算での使用例
if( !(A==B) ) NOT(AとBが一致)
よく見る形に書き換えると
if( A!=B ) (AとBが一致しない)
ここまでは授業等でも頻繁に出てくるので問題ないかと思います。
本題はここから
ビット演算
とりあえず使うのはこの3つ
AND
OR
NOT
論理演算とビット演算で根本的な内容は同じだけど、やることが若干違う。
AND(および)
ビット演算での使用例
C=A&B (AとBをビットごとにANDした結果をCに代入)
OR(および)
ビット演算での使用例
C=A|B (AとBをビットごとにORした結果をCに代入)
NOT(反転)
ビット演算での使用例
C=~A (AをビットごとにNOTした結果をCに代入)
※「~」はShift+^で入力。
通常、C言語の開発環境では~は上付き文字の様に表示されます。
これらは基本的に2進数の話なので、とりあえず2進数で考えます。
AND
0b0100101000100110
& 0b0110110010100010
↓
0b0100100000100010
OR
0b0100101000100110
| 0b0110110010100010
↓
0b0110111010100110
NOT
~ 0b0100101000100110
↓
0b1011010111011001
使う記号が変わっただけでやってる内容を理解するのは難しくないと思います。
これも授業等で習った人が居ると思います。
問題なのは使い道
AND:特定の場所から情報を取り出す
0b0100101000100110
& 0b0000111100000000
↓
0b0000101000000000
OR:特定の場所に1を上書きする
0b0100101000100110
| 0b0000111100000000
↓
0b0100111100100110
NOT+AND:特定の場所に0を上書きする
まず反転
~ 0b0000111100000000
0b1111000011111111
これをAND
0b0100101000100110
& 0b1111000011111111
0b0100000000100110
特定の場所を指定するための変数をマスク等と呼びます。
マスクをかぶせる事で0の部分が見えなくなり、1の部分のみ見える様になります。
C言語での表記は以下
d_in=0x4A26; //入力
mask=0x0F00; //マスク
取り出し
d_out = d_in & mask;
1を上書き
d_out = d_in | mask;
0を上書き
d_out = d_in & ~mask;
大量にあるマイコンの端子から一部のデータを取り出したい場合や
マイコンの端子の機能設定や入出力制御を行いたい場合に使用します。
ビットシフト
これは上記マスクを作成する場合に使用します。
たとえば右から12番目を指定した場合
0b0000000000000001 11ビットシフト
↓
0b0000100000000000
の様に処理します。
C言語の表記は以下
mask = 0x0001<<11;
このマスクを使ってビット演算を行います。