【はじめてのプチコン】論理演算 | りょうのゲーム塾

りょうのゲーム塾

再開、準備中。

チェックポイント
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
0002 A = &B0011
0003 B = &B0101
0004 ANS_OR = A OR B
0005 ANS_AND = A AND B
0006 ANS_XOR = A XOR B
0007 PRINT "OR=";ANS_OR
0008 PRINT "AND=";ANS_AND
0009 PRINT "XOR=";ANS_XOR
0010 PRINT "NOT=";NOT 0
0011 END


実行結果は?

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なのです。

では次回なぜそうなのか解説したいと思います。