SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

マンガで分かるプログラミング用語辞典

「論理演算」
~マンガでプログラミング用語解説

マンガで分かるプログラミング用語辞典(16)

解説

 数値を算術演算子で計算するように、ブーリアンの値は、論理演算子で計算できます。

用語の説明(以下は同じ意味を表します)
  • ブーリアンの値 = 論理値、ブール値
  • ブーリアンの計算 = 論理演算、ブール演算
  • ブーリアンの計算を行う記号 = 論理演算子、ブール演算子

 この論理演算の様子は、一般的にベン図(Venn diagram)で表現されます。

図)集合A
図)集合A
図)集合Aの論理否定(NOT)
図)集合Aの論理否定(NOT)
記号:!
式の例:res = ! a;
図)集合Aと集合Bの論理積(AND)
図)集合Aと集合Bの論理積(AND)
記号:&
式の例:res = a & b;
図)集合Aと集合Bの論理和(OR)
図)集合Aと集合Bの論理和(OR)
記号:|
式の例:res = a | b;
図)集合Aと集合Bの排他的論理和(XOR)
図)集合Aと集合Bの排他的論理和(XOR)
記号:^
式の例:res = a ^ b;

 また、これらの記号は、整数型の値に対しても使われます。この場合は、数値をビットごとに見て、各ビットの0をfalse、1をtrueとして計算を行います。

例)ANDの場合
   0000 1100
&  0000 1010
──────↓各ビットの論理積を取る
   0000 1000
例)ORの場合
   0000 1100
|  0000 1010
──────↓各ビットの論理和を取る
   0000 1110
例)XORの場合
   0000 1100
^  0000 1010
──────↓各ビットの排他的論理和を取る
   0000 0110

 論理演算子も演算子の一つなので、「演算子の優先順位」に従って計算が行われていきます。この優先順位は、プログラミング言語によって異なりますので、使用する言語の仕様を確認してください。

 また、演算子の優先順位だけでは見難いために、人間が見やすいように、適宜カッコを付けることで、式が見やすくなります。

例)適宜カッコを付ける
1 > 2 & 2 < 3 ← 見にくいだけでなく、優先順位を間違うと想定と異なる解になる
↓
(1 > 2) & (2 < 3) ← 人間が見やすいように、適宜カッコを付ける
↓
false & true ← カッコの中の比較演算子が計算される
↓
false ← 論理演算子が計算される
コラム

 「&」や「|」といった記号の結果は、プログラミング言語によって違います(ブーリアンの計算を、論理演算と見なすか、数値のビット演算と見なすかなど)。

 例えばJavaScriptでは、「&」や「|」は数値のビット演算用の演算子です。そのため、ブーリアンの値を利用していても数値で結果が出ます。

<html>
    <head>
        <title>「論理演算」のサンプル</title>
    </head>
    <body>
        <pre><script type="text/javascript">
            document.writeln("「true  & true」 の場合 " + (true  & true));
            document.writeln("「true  & false」の場合 " + (true  & false));
            document.writeln("「false & true」 の場合 " + (false & true));
            document.writeln("「false & false」の場合 " + (false & false));
            document.writeln("");

            document.writeln("「true  | true」 の場合 " + (true  | true));
            document.writeln("「true  | false」の場合 " + (true  | false));
            document.writeln("「false | true」 の場合 " + (false | true));
            document.writeln("「false | false」の場合 " + (false | false));
            document.writeln("");

            document.writeln("「true  ^ true」 の場合 " + (true  ^ true));
            document.writeln("「true  ^ false」の場合 " + (true  ^ false));
            document.writeln("「false ^ true」 の場合 " + (false ^ true));
            document.writeln("「false ^ false」の場合 " + (false ^ false));
        </script></pre>
    </body>
</html>
出力結果)
「true  & true」 の場合 1
「true  & false」の場合 0
「false & true」 の場合 0
「false & false」の場合 0

「true  | true」 の場合 1
「true  | false」の場合 1
「false | true」 の場合 1
「false | false」の場合 0

「true  ^ true」 の場合 0
「true  ^ false」の場合 1
「false ^ true」 の場合 1
「false ^ false」の場合 0

 また、Javaでは「&」や「|」といった記号は、ブーリアンの場合は論理演算子として働き、整数型の数値の場合はビット演算子として働きます。

サンプル

 論理演算を使った処理を、Javaで簡単に書いてみます。

package sample;

public class MainClass {
    public static void main(String[] args) {
        // booleanの論理演算
        boolean a = true, b = true;
        for (int i = 0; i < 4; i ++) {
            switch(i) {
            case 0: a = true;  b = true;  break;
            case 1: a = true;  b = false; break;
            case 2: a = false; b = true;  break;
            case 3: a = false; b = false; break;
            }

            System.out.println("aは「" + a + "」 bは「" + b + "」");
            System.out.println(" 「a&b」の場合 " + (a & b));
            System.out.println(" 「a|b」の場合 " + (a | b));
            System.out.println(" 「a^b」の場合 " + (a ^ b));
            System.out.println(" 「!a」 の場合 " + (!a));
            System.out.println("");
        }

        // 整数の論理演算
        int c = 12;    // 1100
        int d = 10;    // 1010
        System.out.println("cは「" + form(c) + "」 dは「" + form(d) + "」");
        System.out.println(" 「a&b」の場合 " + form(c & d));
        System.out.println(" 「a|b」の場合 " + form(c | d));
        System.out.println(" 「a^b」の場合 " + form(c ^ d));
    }

    // 数値を、4桁の2進数の文字列表現に変換
    private static String form(int i) {
        return String.format("%4s", Integer.toBinaryString(i)).replaceAll(" ", "0");
    }
}
出力結果)
aは「true」 bは「true」
 「a&b」の場合 true
 「a|b」の場合 true
 「a^b」の場合 false
 「!a」 の場合 false

aは「true」 bは「false」
 「a&b」の場合 false
 「a|b」の場合 true
 「a^b」の場合 true
 「!a」 の場合 false

aは「false」 bは「true」
 「a&b」の場合 false
 「a|b」の場合 true
 「a^b」の場合 true
 「!a」 の場合 true

aは「false」 bは「false」
 「a&b」の場合 false
 「a|b」の場合 false
 「a^b」の場合 false
 「!a」 の場合 true

cは「1100」 dは「1010」
 「a&b」の場合 1000
 「a|b」の場合 1110
 「a^b」の場合 0110
フィードバックお待ちしております!

 ご感想、解説して欲しい用語、解説内容のアドバイスなどございましたら、FacebookTwitterなどでお気軽に編集部までお寄せください。よろしくお願いいたします。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
マンガで分かるプログラミング用語辞典連載記事一覧

もっと読む

この記事の著者

柳井 政和(ヤナイ マサカズ)

クロノス・クラウン合同会社 代表社員http://crocro.com/オンラインソフトを多数公開。プログラムを書いたり、ゲームを作ったり、記事を執筆したり、マンガを描いたり、小説を書いたりしています。「めもりーくりーなー」でオンラインソフト大賞に入賞。最近は、小説家デビューして小説も書いています(『裏切りのプログラム』他)。面白いことなら何でもOKのさすらいの企画屋です。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/6881 2012/12/04 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー