KOSEIのブログ

自分の可能性をどこまでも

論理演算<元SE独白記>

<元SE独白記>  2016/06/11

今日は「論理演算」について書きます。といっても何をどう書いていいのやら。「使ったことがある」というのと「説明できる」というのは話が違いますからね。そこでインターネット検索の力を借りましょう。「論理演算」で検索すると、以下のような説明がでてきます。

論理演算とは、2つ以上の1または0入力値に対して、1つの演算結果(1または0)を出力する演算のことである。 論理演算は、初級シスアドの試験では重要でSQL文における抽出条件の作成などにおいて必要不可欠な考え方だからだ。 論理演算の演算の種類として、論理積(AND)、論理和(OR)と否定(NOT)の3種類がある。

またまた意味不明な言葉が出てきたと思います。「シスアド」とは、システム・アドミニストレーター、つまりシステム管理者とでもいう役割を受け持つ人です。初級とあるのでシスアドになるためには基礎的で重要な知識ということですね。SQLとはデータベースを使いこなすときに必要な言語です。さて、この論理演算ですが、別名「ブール代数」ともいいます。上の説明にもあるように「0」と「1」だけの演算です。2進数演算といってもいいですね。具体的に説明します。演算をする二つの要素を「A」と「B」とします。

論理積(AND条件) AもBも、すべて「1」の時に「1」を出力する(答は「1」になる)、それ以外の場合の答えは「0」。つまり次のようになります。

0x0=0、0x1=0、1x0=0、1x1=1

これだけだと、一体何のことやら・・?ですよね。でもちゃんと使い道があるのであります。それどころか論理演算はかなり重要なものなのです。では引き続き

論理和(OR条件) AかBのいずれかが「1」の時に「1」を出力する。それ以外のときは「0」を出力する。

0x0=0、0x1=1、1x0=1、1x1=1

否定(NOT条件) A、Bどちらかの値が「1」なら「0」に、「0」なら「1」に反転する。

以上3つを基本にして幾つか組み合わせパターンがあります。

否定的論理和(NAND条件) すべての値が「0」のときに「1」を出力

ここら辺は説明が煩雑ですので、「こういうのがあるな」ぐらいに考えて置いてください。

排他的論理和(EOR、XOR条件) 入力値が違うとき1を出力する。それ以外(入力値が同じとき)は、0を出力する。

これらは高校の数学で習った「集合」を想い出すといいと思います。以上の記事はインターネット上のサイトを参考にさせていただきました。

http://www.pursue.ne.jp/jouhousyo/sysad/sysad011.htm

もうちょっと詳しく知りたい人は上記サイトで勉強してください。他にもたくさんあります。

では「実際にどう使うの?」という話ですが、たとえば「あるビットにフラグが立っていたら(「1」だったら)処理するようにしたい」というときには二つのコーディングの仕方があります。ABCと名前をつけた8ビットの記憶エリアの一番右端の(0ビットめ)が「1」だったら、ある処理をしたい、としましょう。

方法1:if ABC = 1 then ある処理  これは最もベタなコーディングです。

方法2:ABCDという記憶エリアにあらかじめ「00000001」を格納しておきます。そのうえで、

「ABC XOR ABCD = 真 ならば ある処理」とします。

論理演算の一番簡単なつかい方はこのようなビット検査の時に使いますが、そのほかにも論理演算子を使うことで「a と bが等しい」かつ「c は dよりも大きい」といった条件式を組み合わせたより複雑な条件式を記述することができるのです。

上の例で0ビットめのチェックの場合、もちろん方法1でも方法2でも、どちらでも結果は同じで同じ動作をします。しかしプログラムが走っている(動作している)環境はしょっちゅう変わるものです。「0ビットめじゃなくて3ビットめのみが「1」だったら「ある処理」を実行しよう、というように変わったとします。すると方法1でコーディングしていた場合は、変更が発生します。コードの修正です。「if ABC = 1」のコードを「if ABC = 4」に修正する必要が発生します。使用している箇所が多いとそれだけ修正時のミスも増えます。ところが、論理演算をつかうことによって、大元の「ABCD]の内容のみを修正すればいいので、ラクですし間違いも少ないのです。

KOSEI