| チェックポイント DSiのボタン情報を取得するとき AND 演算子を使用しました。 この処理をマスク処理と呼びます。(過去記事参照のこと) 論理演算を使うことで意外と面倒な処理を比較的簡単に解決することができます。 そのためにも論理演算がどんな演算なのかを知っておきましょう。 |
論理演算は2進数1桁毎の演算です。
2進数は0と1の2つの値しかありません。
その演算の組み合わせは4通りしかありません。
では論理演算はどういうものか見てみましょう。
| ■OR(論理和) | ||
| a | b | a OR b |
|---|---|---|
| 0 0 1 1 | 0 1 0 1 | 0 1 1 1 |
もともと論理とはその条件が成立するのかしないのかを計算するもので条件が成立する事を真または true と表し、2進数では1となります。
逆に成立しないことを偽または false と表し、2進数では0となります。
論理和は2つの条件がどちらか一方が成り立つ場合に真となります。
上のような論理演算の表を真理値表といいますが、その表を見てください。
a の条件と b の条件のどちらか一方が成り立てば真(1)となります。
| ■AND(論理積) | ||
| a | b | a AND b |
|---|---|---|
| 0 0 1 1 | 0 1 0 1 | 0 0 0 1 |
論理積は2つの条件が共に成り立つ場合真(1)となります。
| ■XOR(排他的論理和) | ||
| a | b | a XOR b |
|---|---|---|
| 0 0 1 1 | 0 1 0 1 | 0 1 1 0 |
排他的論理和は論理和に近いのですが2つの条件のどちらか一方のみ成立する場合に真(1)となります。論理和は両方共に成立しても真ですが、排他的論理和は片方のみ真のとき真となります。
では実際にそれが本当なのか実際にプログラミングしてみましょう。
論理演算は2進の各桁で計算されます。
上の真理値表の a は上から 0011 です。
b は上から 0101 です。
ということはこの表の計算を一度に計算するのですから
0011 OR 0101
0011 AND 0101
0011 XOR 0101
でいいわけです。
計算は2進で計算されますが結果が10進で表示されるので変換表も表示しておきます。
あ、もうひとつ論理演算に NOT があります。
これは否定です。
真(1)だったら偽(0)へ、偽(0)だったら真(1)へ反転します。
| ■変換表 | |
| 10進数 | 2進数 |
|---|---|
| 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 |
| ■プログラム |
0001 ' sample program |
実行結果は?
0011 OR 0101 = 0111 = 7
0011 AND 0101 = 0001 = 1
0011 XOR 0101 = 0110 = 6
だから
OR=7
AND=1
XOR=6
になりましたか?
問題は NOT なんですが0の反転は・・・1なのに・・・答えは-1でした
本来0とは2進数でプチコン内部では32ビットの固定少数点方式です。
整数部分は20ビット(だったかなぁ?)小数部は12ビットで下記のようなものです。
00000000000000000000.000000000000
しかし、論理演算で整数で扱えば20ビットの値と同じです(たぶん^^;)
ですので0は2進数で
00000000000000000000
です。
これを NOT すると
11111111111111111111
となります。
実は数値は負の値も持っています。
ちなみに一番左のビットはサイン(符号)ビットともいいます。
0のとき正の数で、1のとき負の数です。
じゃ、正の1は
00000000000000000001
だから負の-1は
10000000000000000001
では?
って、たぶん賢いあなただったら思うはず!!
けど現実は違って
11111111111111111111
が-1なのです。
では次回なぜそうなのか解説したいと思います。