論理演算は複雑な条件を組み立てたい場合に利用する演算で、「AとBの条件がどちらも当てはまる」「AかBの条件で一方でも当てはまっている場合」などの条件を作成したいときに利用します。
論理演算は比較演算と同様に処理結果がtrueかfalseになります。
もくじ
論理演算の種類
論理演算には「AND演算」「OR演算」「XOR演算」「NOT演算」があります。
NOT演算以外の演算では、左右の被演算子はtrueかfalseのいずれかになる必要があります。
(NOT演算は左のみに被演算子がある)
それぞれの演算子は以下のようになります。
演算の種類 | 演算子 | 記述例 | 説明 |
---|---|---|---|
AND演算 | && | x > 0 && x < 11 | &&の右と左の両方がtrueの場合のみtrueになる |
OR演算 | || | x == 3 || y == 5 | ||の右か左の一方がtrueの場合にtrueになる |
XOR演算 | ^ | x == 3 ^ y == 5 | ^の右と左の片方がtrueの場合のみtrueになる |
NOT演算 | ! | !(x == 1) | trueはfalseに、falseはtrueになる |
各種論理演算子の説明
AND演算
x > 0 && x < 11
「xが0より大きい」かつ「xが11より小さい」となっている。
AND演算は両方の条件(今回は比較演算)でtrueになる場合のみtrueになる為、斜線部分が当てはまる部分になります。
※「0から11(0と11は含まない)」の範囲であればtrueとなる
以下はAND演算時、左右の被演算子の結果の組み合わせによってAND演算後の結果がどのような結果になるかを表にしたものです。
AND演算 | ||
---|---|---|
左側の条件結果 | 右側の条件結果 | AND演算後の結果 |
true | true | true |
true | false | false |
false | true | false |
false | false | false |
OR演算
x == 3 || y == 5
「xが3と等しい」もしくは「yが5と等しい」となっている。
OR演算は一方の条件(今回は比較演算)がtrueであればtrueになる為、丸の部分が当てはまる部分になります。
xが3であればyは5でなくてもtrue。また、yが5であればxは3でなくてもtrueとなります。xが3でyが5の場合もtrueです。
以下はOR演算時、左右の被演算子の結果の組み合わせによってOR演算後の結果がどのような結果になるかを表にしたものです。
OR演算 | ||
---|---|---|
左側の条件結果 | 右側の条件結果 | OR演算後の結果 |
true | true | true |
true | false | true |
false | true | true |
false | false | false |
XOR演算
x == 3 ^ y == 5
「xが3と等しい」もしくは「yが5と等しい」となっている。
XOR演算は一方の条件(今回は比較演算)のみtrueであればtrueになる為、丸の部分が当てはまる部分になります。一見、OR演算と同じですが以下の部分が変わります。
xが3の場合、yは5でなければtrue。また、yが5の場合、xは3でなければtrueとなります。つまり、XORではxが3でyが5の場合はfalseとなります。
以下はXOR演算時、左右の被演算子の結果の組み合わせによってXOR演算後の結果がどのような結果になるかを表にしたものです。
XOR演算 | ||
---|---|---|
左側の条件結果 | 右側の条件結果 | XOR演算後の結果 |
true | true | false |
true | false | true |
false | true | true |
false | false | false |
NOT演算
!(x == 1)
「xが1と等しいを否定」となっている。つまり、xが1と等しくないことを指しています。
NOT演算はtrueをfalseに、falseをtrueに反転させる為、斜線が当てはまる部分になります。
xが1の時はtrueになりますがNOT演算で反転しfalseに、xが1でない時はfalseになりますがNOT演算で反転しtrueとなります。
以下はNOT演算時後の結果がどのような結果になるかを表にしたものです。
NOT演算 | ||
---|---|---|
対象となる条件結果 | NOT演算後の結果 | |
true | false | |
false | true |
論理演算 サンプルプログラム
以下のプログラムを「Number10.java」という名前でworkフォルダ内に保存します。
保存が完了したら、コマンドプロンプトを起動し、コンパイルおよび実行を行ってみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class Number10{ public static void main(String[] args){ int x = 3; int y = 5; System.out.println("x > 0 && x < 11"); System.out.println(x > 0 && x < 11); System.out.println("x == 3 || y == 5"); System.out.println(x == 3 || y == 5); System.out.println("x == 3 ^ y == 5"); System.out.println(x == 3 ^ y == 5); System.out.println("!(x == 1)"); System.out.println(!(x == 1)); } } |
実行例
c:\work>javac Number10.java
c:\work>java Number10
x > 0 && x < 11
true
x == 3 || y == 5
true
x == 3 ^ y == 5
false
!(x == 1)
true
※実行例はコンパイルから実行までの例を表示しています。
補足説明
AND演算とOR演算にはそれぞれ2つの種類があります。
演算の種類 | 演算子 | 記述例 | 演算説明 |
---|---|---|---|
AND演算 | && | x > 0 && x < 11 | 演算子の右左の両方がtrueの場合のみtrueになる |
& | x > 0 & x < 11 | ||
OR演算 | || | x == 3 || y == 5 | 演算子の右左の一方がtrueの場合にtrueになる |
| | x == 3 | y == 5 |
&&と&、||と|の違いは、左の被演算子(式)の結果により右の被演算子(式)の実行がするかどうかが決まります。
例えば、次のようなAND演算があります。
int x1 = 0 ;
boolean b1 = x1 > 0 && ++x1 < 11 ;
System.out.println(b1);
System.out.println(x1);
int x2 = 0;
boolean b2 = x2 > 0 & ++x2 < 11 ;
System.out.println(b2);
System.out.println(x2);
上記のb1とb2の結果は変わりません。しかし、x1とx2では違う結果となります。
AND演算はどちらもtrueの時のみtrueとなる為、どちらか一方でもfalseの場合はfalseが確定されます。
論理演算では左の式実行後に右の式を実行しますが、&&を利用したAND演算では左の式がfalseだった場合は右を実行しなくともfalseが確定する為、右の式を実行しないという特性があります。この動きは短絡評価(ショートサーキット)と表現されます。
&は短絡評価は行わないので、左の式の結果にかかわらず必ず右の式も実行します。
x1 > 0 && ++x1 < 11 の式ではx1に0が代入されており左の式がfalseになり、右の式が実行されません。
右の式のインクリメントは動作しませんので、x1は0のままとなります。
x2 > 0 & ++x2 < 11 の式ではx2に0が代入されており左の式がfalseになりますが、右の式は実行されます。
右の式のインクリメントが動作し、x2は1に変わります。
次はOR演算です。
int x3 = 0 ;
boolean b3 = x3 >= 0 || ++x3 < 11 ;
System.out.println(b3);
System.out.println(x3);
int x4 = 0;
boolean b4 =x4 >= 0 | ++x4 < 11 ;
System.out.println(b4);
System.out.println(x4);
上記のb3とb4の結果はAND演算同様変わりません。しかし、x3とx4では違う結果となります。
OR演算はどちらか一方でもtrueの場合はtrueとなる為、片方でもtrueの場合はtrueが確定されます。
論理演算では左の式実行後に右の式を実行しますが、||を利用したOR演算では左の式がtrueだった場合は右を実行しなくともtrueが確定する為、右の式を実行しないという特性があります。この動きは前述した短絡評価(ショートサーキット)と呼ばれる動作です。
|は短絡評価は行わないので、左の式の結果にかかわらず必ず右の式も実行します。
x3 >= 0 || ++x3 < 11 の式ではx3に0が代入されており左の式がtrueになり、右の式が実行されません。
右の式のインクリメントは動作しませんので、x3は0のままとなります。
x4 >= 0 | ++x4 < 11 の式ではx4に0が代入されており左の式がtrueになりますが、右の式は実行されます。
右の式のインクリメントが動作し、x4は1に変わります。
論理演算 サンプルプログラム
「Number10.java」のプログラムを以下のように変更してworkフォルダ内に保存します。
保存が完了したら、コマンドプロンプトを起動し、コンパイルおよび実行を行ってみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
class Number10{ public static void main(String[] args){ int x = 3; int y = 5; System.out.println("x > 0 && x < 11"); System.out.println(x > 0 && x < 11); System.out.println("x == 3 || y == 5"); System.out.println(x == 3 || y == 5); System.out.println("x == 3 ^ y == 5"); System.out.println(x == 3 ^ y == 5); System.out.println("!(x == 1)"); System.out.println(!(x == 1)); //ここから追加 int x1 = 0 ; boolean b1 = x1 > 0 && ++x1 < 11 ; System.out.println(b1); System.out.println(x1); int x2 = 0; boolean b2 = x2 > 0 & ++x2 < 11 ; System.out.println(b2); System.out.println(x2); int x3 = 0 ; boolean b3 = x3 >= 0 || ++x3 < 11 ; System.out.println(b3); System.out.println(x3); int x4 = 0; boolean b4 =x4 >= 0 | ++x4 < 11 ; System.out.println(b4); System.out.println(x4); } } |
実行例
c:\work>javac Number10.java
c:\work>java Number10
x > 0 && x < 11
true
x == 3 || y == 5
true
x == 3 ^ y == 5
false
!(x == 1)
true
false
0
false
1
true
0
true
1
※実行例はコンパイルから実行までの例を表示しています。
まとめ
- 論理演算を利用すると様々な条件を作成することができる
- 「AND演算」は右と左の被演算子が両方trueの時のみtrue
- 「OR演算」は右か左の被演算子が片方でもtrueの時にtrue
- 「XOR演算」は右か左の被演算子がtrueの時のみtrue
- 「NOT演算」は被演算子を否定して、trueはfalseに、falseはtrueとなる
- &&と||は短絡評価となり、左側の被演算子により右側の式(被演算子)を実行しないことがある