解説
数値を算術演算子で計算するように、ブーリアンの値は、論理演算子で計算できます。
用語の説明(以下は同じ意味を表します)
- ブーリアンの値 = 論理値、ブール値
- ブーリアンの計算 = 論理演算、ブール演算
- ブーリアンの計算を行う記号 = 論理演算子、ブール演算子
この論理演算の様子は、一般的にベン図(Venn diagram)で表現されます。
記号:! 式の例:res = ! a;
記号:& 式の例:res = a & b;
記号:| 式の例:res = a | b;
記号:^ 式の例:res = a ^ b;
また、これらの記号は、整数型の値に対しても使われます。この場合は、数値をビットごとに見て、各ビットの0をfalse、1をtrueとして計算を行います。
0000 1100 & 0000 1010 ──────↓各ビットの論理積を取る 0000 1000
0000 1100 | 0000 1010 ──────↓各ビットの論理和を取る 0000 1110
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
