5.演算子

5-8. 論理演算子・論理の表現

◆論理とは?

論理というと結構苦手な人多いのではないでしょうか?

数学の中でも最も記号の統一性が無いと言うか…
具体的に論理で使う記号は、∈∋⊆⊇⊂⊃∪∩∧∨¬≡~などがあって

この中には、複合的な意味を持つものと同じ意味を持っているものがあります。

コンピュータではそんな複雑なことはしないので少し楽です。

基本的にコンピュータの論理に使うのは次の3つです。
(コロンより右側がC言語での表記です)
論理積(AND)∩・∧:&&
論理和(OR) ∪・∨:||
否定(NOT) ~・¬:!

結果として真と偽の2値で表現されます。

では、論理をベン図を用いて説明していきましょう
対象は、論理積(AND)と論理和(OR)それに否定(NOT)です。

まずは論理積、言葉で表現すると、

A かつ B、 AでありBでもある。 …となります。

これを図にして表現すると、

●:Aの円
○:Bの円
※:A AND B の領域

    ●●●   ○○○    
  ●●   ●◎○   ○○  
 ●     ○※●     ○ 
 ●     ○※●     ○ 
●     ○※※※●     ○
●     ○※※※●     ○
●     ○※※※●     ○
 ●     ○※●     ○ 
 ●     ○※●     ○ 
  ●●   ●◎○   ○○  
    ●●●   ○○○    

となり、AとBの両方に属する部分になります。

つぎに、論理和OR、言葉で表現するとAまたはBとなります。
つまりAとBのどちらかに属していればよいので(両方に属していてもいい)
ベン図は次のようになります。

●:Aの円
○:Bの円
※:A OR B の領域

    ●●●   ○○○    
  ●●※※※●◎○※※※○○  
 ●※※※※※○※●※※※※※○ 
 ●※※※※※○※●※※※※※○ 
●※※※※※○※※※●※※※※※○
●※※※※※○※※※●※※※※※○
●※※※※※○※※※●※※※※※○
 ●※※※※※○※●※※※※※○ 
 ●※※※※※○※●※※※※※○ 
  ●●※※※●◎○※※※○○  
    ●●●   ○○○    

最後に否定のNOT、これはAでないなどと表現されます。
これをベン図にすると、

●:Aの円
○:Bの円
※:NOT A の領域

※※※※●●●※※※○○○※※※※
※※●●   ●◎○※※※○○※※
※●     ○ ●※※※※※○※
※●     ○ ●※※※※※○※
●     ○   ●※※※※※○
●     ○   ●※※※※※○
●     ○   ●※※※※※○
※●     ○ ●※※※※※○※
※●     ○ ●※※※※※○※
※※●●   ●◎○※※※○○※※
※※※※●●●※※※○○○※※※※

図のようにNOT A はAの外側になりました。

◆論理の表現

今日は、コンピュータで論理の表現についてです。

前回行った、論理積、論理和、否定などはコンピュータではどのように表現されているのでしょうか?

つまり、真と偽がコンピューター内で表現される時どうなっているかという内
容になります。

まず、今までどおりの論理で0~9までの数値をとる変数iを考えて見ます。
集団Aの条件はi>3、集団Bの条件は0<i<7とします。

それを、図に表すと下のようになります。

        ┌───Aの集団────┐
┌─┬─────┬─────┬─────┐
│0│1 2 3│4 5 6│7 8 9│
└─┴─────┴─────┴─────┘
  └───Bの集団────┘

ここで AかつBとすれば、対象となる範囲は4~6になります。(AND)
また AまたはBとすれば、対象となる範囲は1~9になります。(OR)

これがコンピュータではどのようになるのか?

いままでは、条件をすべて真と見なして取りうる範囲を求めましたが、コンピュータでは条件の真偽しか判断することができません。

つまり、変数iは既知でなければならず、それが条件を満たしているかどうかの判断しかできないのです。(もちろん真偽は1・0の値として表現されます)

それでは、上の例をiを0~9まで値を変えながらどのように判断されるか表にしてみます。

論理積(AND)の場合:

iの値 A B AかつB
 0  偽 偽  偽
1~3 偽 真  偽
4~6 真 真  真
7~9 真 偽  偽

AかつBはAもBもどちらとも条件を満たさなければ偽と判断されます。

次に、

論理和(OR)の場合:

iの値 A B AまたはB
 0  偽 偽  偽
1~3 偽 真  真
4~6 真 真  真
7~9 真 偽  真

AかBのどちらか条件を満たせばよいので1~9の範囲で真と判断されます。

これらを、コンピュータが扱う値に直すと、関係演算子も論理演算子も真偽は1と0の値で表現されるので、上の表は次のように書きなおすことができます。

A B AND ∥ A B OR
0 0  0  ∥ 0 0 0
0 1  0  ∥ 0 1 1
1 0  0  ∥ 1 0 1
1 1  1  ∥ 1 1 1

最後に演算例としてiが2のとき、
  A:i>3   2>3  …偽→0
  B:0<i<7 0<2<7…真→1
A&B:AかつB  0かつ1 …偽→0

結局i=2のとき
AかつB(3<i<7)は偽と判断されます。

ずいぶん前置きが長くなってしまいましたが久々C言語にもどります。

C言語の論理演算子は次の3種類があります。

論理積  &&
論理和  ||
論理否定 !

このうち論理否定だけが単項演算子で前置です。真と偽を反転します。

これを前回の例を使って、関係演算子と一緒に使うと、

i > 3 && (i > 0 && i 3) && (i > 0 && i 3 && (i > 0 && i < 7))

2つとも正解です。説明のためにこれらの式を言葉にしてみましょう。

2は3より大きくない かつ 0より大きく7より小さい。
(2は3より大きい かつ 0より大きく7より小さい)以外。

いままでの説明が長かったので実際に演算子にはいるとこうも説明が短くなるのかな~