テーマ
第10回目となる本稿のテーマは、「論理演算を行う」です。
今まで、算術演算、比較演算を学習してきました。本稿ではもう一つの演算の種類である論理演算について学習します。この後の Chapter では条件分岐や繰り返し処理といったプログラムの基本制御を学びますので、その前提知識となる論理演算について学習していきましょう。
論理演算
概要
論理演算の概要について説明します。論理演算とは一つまたは二つのオペランドに対して行われる演算で、オペランドは数値型の値、または論理型の値です。そして論理演算の演算結果は論理型の値となります。論理演算の内部的な処理が各オペランドのビット単位で行われることからビット演算と呼ばれることもあります。イントロダクションコースでは、オペランドが論理型の値をとる場合の論理演算のみを取り扱います。オペランドが数値型の論理演算については基礎コースにて学習する予定です。
And (論理積)
まずはじめに、論理積について学習しましょう。論理積は、二つのオペランドが両方とも真であるとき、真と評価されます( True となります)。それ以外の場合は常に偽と評価されます( False となります)。先に述べた通り、演算の結果も論理型となります。
具体例を見ていくために以下のマクロを Sheet1 シートモジュールへ記述してください。
Public Sub Chapter10_And()
Debug.Print
Debug.Print "True And True: " & CStr(True And True)
Debug.Print "True And False: " & CStr(True And False)
Debug.Print "False And True: " & CStr(False And True)
Debug.Print "False And False: " & CStr(False And False)
End Sub
マクロの記述を終えたら F5 キーを押して実行してみましょう。以下のようにイミディエイトウインドウに出力されます。
True And True: True True And False: False False And True: False False And False: False
それでは論理積演算のオペレーターとオペランドについて説明しましょう。
( True And True )
And は論理積を演算するオペレーター(演算子)です。必ずオペレーターの両側にオペランド(演算対象)が必要です。この例では左側の True と右側の True がオペランドです。And オペレーターは両側のオペランドが両方とも真、即ち True であるときに演算結果が真、即ち True となり、オペランドのいずれか一方または両方とも False のときには偽、即ち False と演算します。そのため、True And True の演算結果は True となります。別の言い方をすれば、True And True は And オペレーターによって True と評価されます。
( True And False ) や ( False And True )、( False And False ) の3つの式は、片方あるいは両方のオペランドが False であるため、And オペレーターによっていずれも False と評価されます。
それでは、演算例をもう少し現実的なものにしてみましょう。以下のマクロを Sheet1 シートモジュールへ追加してください。
Public Sub Chapter10_And2()
Dim value100 As Long
value100 = 100
Debug.Print
Debug.Print "(50 < value100) And (value100 < 1000) : " & CStr((50 < value100) And (value100 < 1000))
Debug.Print "(0 < value100) And (1000 < value100) : " & CStr((0 < value100) And (1000 < value100))
Debug.Print "(200 = value100) And (100 <= value100) : " & CStr((200 = value100) And (100 <= value100))
Debug.Print "(100 <> value100) And (1000 / 10 < value100) : " & CStr((100 <> value100) And (1000 / 10 < value100))
End Sub
マクロを追加できましたら F5 キーを押して実行してください。以下の結果が出力されます。
(50 < value100) And (value100 < 1000) : True (0 < value100) And (1000 < value100) : False (200 = value100) And (100 <= value100) : False (100 <> value100) And (1000 / 10 < value100) : False
このマクロでは、先ず Long 型変数 value100 を用意し、整数 100 を代入しています。その後、() 内にある 2 つの比較演算を行い、それぞれの演算結果を And オペレーターのオペランドとしています。例えば 7行目のコードは、(50 < value100) という比較演算と (value100 < 1000) という比較演算を And オペレーターでつなぐことで、この 2 つの比較演算の結果が両方 True であるかを調べている、ということです。もう一度 And オペレーターの演算を思い出してください。And オペレーターは両側のオペランドがともに True であるとき、True と評価するのでしたね。いま、value100 には 100 が保持されていますから、50 < value100 と value100 < 1000 という二つの比較はいずれも True です。したがって、この式の () 内の演算を行った結果、True And True という式が現れます。And の両側のオペランドはともに True なので最終的にこの式は True と評価されます。
尚、上記の式 (50 < value100) And (value100 < 1000) は、() がなくても And よりも先に < の演算が行われますが、読みやすさの観点からここでは () を用いています(各オペレーターの演算優先順位は基礎コースで詳しく学習します)。
Or (論理和)
次に、論理和について学習しましょう。論理和は、2つのオペランドのうちいずれか一方または両方が真のとき、真と評価されます( True になります)。逆に言えば、2つのオペランド両方が偽であるとき、偽と評価されます( False となります)。論理和も論理積同様、演算結果は常に論理型の値を採ります。
言葉では理解しにくいと思うので具体例を見ていきましょう。以下のマクロを Sheet1 シートモジュールに記述してください。
Public Sub Chapter10_Or()
Debug.Print
Debug.Print "True Or True: " & CStr(True Or True)
Debug.Print "True Or False: " & CStr(True Or False)
Debug.Print "False Or True: " & CStr(False Or True)
Debug.Print "False Or False: " & CStr(False Or False)
End Sub
マクロの記述を終えたら F5 キーを押して実行してみましょう。以下のようにイミディエイトウインドウに出力されます。
True Or True: True True Or False: True False Or True: True False Or False: False
一番上の CStr() の中にある True Or True という式を見てください。
Or は論理和を演算するオペレーターです。オペレーターの両側に必ずオペランドが必要です。この例では左側の True と右側の True がオペランドです。Or オペレーターは両側のオペランドのいずれか一方または両方が真であるときに、演算結果が真となり、オペランドの両方とも偽であるときは、演算結果が偽となります。そのため、True Or True の演算結果は True となります。別の言い方をすれば、True Or True は Or オペレーターによって True と評価されます。
同様に、( True Or False )、( False Or True ) の 2つの式は、片方が True であるため、演算結果も True となります。最後の式である ( False Or False ) のみ、オペランドのいずれも True ではないため False と評価されます。
Xor(排他的論理和)
次に、排他的論理和について学習しましょう。排他的論理和は、2つのオペランドのうちいずれか一方が真のときだけ、真と評価されます( True になります)。別の言い方をすると、2つのオペランドの両方が偽であるとき、または 2つのオペランドの両方が真であるとき、その式は偽と評価されます( False となります)。排他的論理和も論理和と同様、演算結果は常に論理型の値を採ります。
こちらも言葉では理解しにくいと思うので具体例を見ていきましょう。以下のマクロを Sheet1 シートモジュールに記述してください。
Public Sub Chapter10_Xor()
Debug.Print
Debug.Print "True Xor True: " & CStr(True Xor True)
Debug.Print "True Xor False: " & CStr(True Xor False)
Debug.Print "False Xor True: " & CStr(False Xor True)
Debug.Print "False Xor False: " & CStr(False Xor False)
End Sub
マクロの記述を終えたら F5 キーを押して実行してみましょう。以下のようにイミディエイトウインドウに出力されます。
True Xor True: False True Xor False: True False Xor True: True False Xor False: False
一番上の CStr() の中にある True Xor True という式を見てください。
Xor は排他的論理和を演算するオペレーターです。オペレーターの両側に必ずオペランドが必要です。この例では左側の True と右側の True がオペランドです。Xor オペレーターは両側のオペランドのいずれか一方が真であるときだけ、演算結果が真となります。オペランドの両方が偽であるときや両方が真であるときは、演算結果が偽となります。そのため、True Xor True の演算結果は False となります。別の言い方をすれば、True Xor True は Xor オペレーターによって False と評価されます。
同様に、( False Xor False ) は両方のオペランドが False であるため演算結果は False となります。 ( True Xor False )、( False Xor True ) のように片方が True であるとき、演算結果は True と評価されます。
Eqv(論理等価)
続いて、論理等価について学習します。論理等価もこれまでの論理演算と同じように、2つのオペランドを必要とします。そして両オペランドの論理値が同値であるとき、真と評価されます( True になります)。別の言い方をすると、2つのオペランドの論理値が異なるとき、その式は偽と評価されます( False となります)。論理等価もまた、演算結果は常に論理型の値を採ります。
それでは早速具体例を見ていきましょう。以下のマクロを Sheet1 シートモジュールへ記述してください。
Public Sub Chapter10_Eqv()
Debug.Print
Debug.Print "True Eqv True: " & CStr(True Eqv True)
Debug.Print "True Eqv False: " & CStr(True Eqv False)
Debug.Print "False Eqv True: " & CStr(False Eqv True)
Debug.Print "False Eqv False: " & CStr(False Eqv False)
End Sub
マクロの記述を終えたら F5 キーを押して実行してみましょう。以下のようにイミディエイトウインドウに出力されます。
True Eqv True: True True Eqv False: False False Eqv True: False False Eqv False: True
True Eqv True
この式から見ていきましょう。Eqv は論理等価を演算するオペレーターです。これまでと同様に、Eqv も 2つのオペランドを必要とします。この例では左側の True と右側の True がオペランドです。Eqv オペレーターは両側のオペランドの論理値が等しいとき、演算結果が真となります。オペランドの論理値が異なるときは、演算結果が偽となります。そのため、True Eqv True の演算結果は True となります。別の言い方をすれば、True Eqv True は Eqv オペレーターによって True と評価されます。
( True Eqv False ) や ( False Eqv True ) は、両オペランドの論理値が異なるため False と評価されます。また、( False Eqv False ) は両オペランドが同値であるため True と評価されるのです。
Eqv オペレーターの特徴は、これまでの論理演算とは異なりオペランドの True と False に意味づけをしておらず、単に同値であるかどうかを演算しているところです。
Imp(論理包含)
さらに、論理包含について学習します。論理包含もこれまでの論理演算と同じように、2つのオペランドを必要とします。左のオペランドを A、右のオペランドを B としたときに、A ならば B という命題に矛盾するか否かを調べるときに使います。A と B がともに True であるとき、A ならば B は真となります( True になります)。A が真で B が False となるとき、A ならば B は偽となります ( False になります)。そして、A が偽であるときは、B が真でも偽でも演算結果は真となるのです。
この演算は慣れるまで少し難しいと思いますので早速具体例を見ていきましょう。以下のマクロを Sheet1 シートモジュールに記述してください。
Public Sub Chapter10_Imp()
Debug.Print
Debug.Print "True Imp True: " & CStr(True Imp True)
Debug.Print "True Imp False: " & CStr(True Imp False)
Debug.Print "False Imp True: " & CStr(False Imp True)
Debug.Print "False Imp False: " & CStr(False Imp False)
End Sub
マクロの記述を終えたら F5 キーを押して実行してみましょう。以下のようにイミディエイトウインドウに出力されます。
True Imp True: True True Imp False: False False Imp True: True False Imp False: True
論理包含を演算するオペレーターは Imp です。両側に 2つのオペランドを必要とします。この例では左側の True と右側の True がオペランドです。論理包含は、オペランドの順序が意味づけを行っているので他の論理演算とは異なり、オペランドの左右が入れ替わると演算結果がことなるときがあります(今まで学習した And, Or, Xor, Eqv はオペランドの左右が入れ替わっても演算結果は同じでしたが、Imp は異なるので注意が必要です)。
左側のオペランドを A、右側のオペランドを B とすると、「A が真であるならば B も真である」というのが論理包含の演算です。これに矛盾しない時に演算結果は真となります ( True になります)。もし A が真で B が偽であるなら矛盾を生じるため偽となります ( False となります)。では、A が偽の時はどうなるでしょうか。この場合、B が真偽のいずれでも真となります。「A が真であるならば」が成立しないため、矛盾は生じず真になるということです。
少し癖のある演算のためこのオペレーターの意味と同一の条件判断が必要な場合以外は利用シーンがないかもしれません。あまり重要なオペレーターではないのでそんなものもあるんだ程度の理解で問題ないと思います。
Not(否定)
最後に、否定について学習します。否定はこれまでの論理演算と異なり、オペランドは 1つです。オペレーターの右側にオペランドを置きます。そして否定はオペランドの論理値を反転させる演算を行います。つまり、オペランドが真であれば偽、オペランドが偽であれば真と評価されます。以下のマクロを Sheet1 シートモジュールに記述してください。
Public Sub Chapter10_Not()
Debug.Print
Debug.Print "Not True: " & CStr(Not True)
Debug.Print "Not False: " & CStr(Not False)
End Sub
マクロの記述を終えたら F5 キーを押して実行してみましょう。以下のようにイミディエイトウインドウに出力されます。
Not True: False Not False: True
( Not True )
まずはこの式から見ていきましょう。
Not は否定を演算するオペレーターです。この例では右側の True がオペランドです。否定は、オペランドの真偽値を反転させる演算を行います。Not True はオペランドの真偽値を反転させるのですから演算結果は偽 (False) となります。Not False の場合も、False から True へ反転させる演算を行いますので Not False は真となります( True と評価されます)。
否定の演算は直感的にも理解しやすいと思います。また、数ある論理演算の中でも比較的多く用いられる演算でもありますのでここで身に付けておいてください。
まとめ
論理演算について一通り見てきました。今回は理解を容易にするためにオペランドが全て論理型である場合の説明をしましたが、数値型に対して論理演算を行うこともよくあります。これについては基礎コースで学習する予定です。
| オペレーター | 演算の種類 | オペランド | 使用例 | 演算結果 |
|---|---|---|---|---|
| And | 論理積 | 両側 | True And True True And False False And True False And False | True False False False |
| Or | 論理和 | 両側 | True Or True True Or False False Or True False Or False | True True True False |
| Xor | 排他的論理和 | 両側 | True Xor True True Xor False False Xor True False Xor False | False True True False |
| Eqv | 論理等価 | 両側 | True Eqv True True Eqv False False Eqv True False Eqv False | True False False True |
| Imp | 論理包含 | 両側 | True Imp True True Imp False False Imp True False Imp False | True False True True |
| Not | 否定 | 右側 | Not True Not False | False True |
上記の表が今回学習した内容です。論理演算は使用頻度も高く本コースでも今後何度も登場します。次第に慣れていくことと思いますが、分からなくなったら本稿に戻って復習してください。
それでは本稿はこれで終わりとします、お疲れさまでした。また次回お会いしましょう。

