忍者ブログ

Fグループ電子工作講座

秋月電子SH7125ボードで始めるマイコン開発

ビット演算

マイコンおよび通信系を行う上で必要となるビット演算の話
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

NOTAND特定の場所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;

このマスクを使ってビット演算を行います。
PR

コメント

プロフィール

HN:
ぼんどF博士
性別:
男性

最新コメント