こんにちは、現役SEの「とも」です。
今回は、論理演算子です。
- 論理演算子は、論理積(AND)や論理和(OR)、排他的論理和(XOR)や否定(NOT)を算出するための演算子です。
- boolean型の「リテラル」または「変数」が使用できます。
【論理演算子】
演算子 | 例 | 説明 |
---|---|---|
&& | A && B | 論理積(AND) AとBが「true」の場合は「true」、それ以外は「false」 |
|| | A || B | 論理和(OR) AまたはBのどちらかが「true」の場合は「true」、それ以外は「false」 |
^ | A ^ B | 排他的論理和(XOR) AとBのどちらかが「true」の時のみ「true」、それ以外は「false」 |
! | !A | 否定(NOT) Aが「false」の場合は「true」、「true」の場合は「false」 |
各演算子のサンプル
【論理積(AND)】
boolean a = true && true; //結果はtrue
boolean b = true && false; //結果はfalse
boolean c = false && true; //結果はfalse
boolean d = false && false; //結果はfalse
【論理和(OR)】
boolean a = true || true; //結果はtrue
boolean b = true || false; //結果はtrue
boolean c = false || true; //結果はtrue
boolean d = false || false; //結果はfalse
【排他的論理和(XOR)】
boolean a = true ^ true; //結果はfalse
boolean b = true ^ false; //結果はtrue
boolean c = false ^ true; //結果はtrue
boolean d = false ^ false; //結果はfalse
【否定(NOT)】
boolean a = !true; //結果はfalse
boolean b = !false; //結果はtrue
否定(NOT)は、他の論理演算と組み合わせて使用できます。
【論理積(AND)と否定(NOT)を組み合わせる】
boolean a = !true && true; //結果はfalse
boolean b = !true && false; //結果はfalse
boolean c = !false && true; //結果はtrue
boolean d = !false && false; //結果はfalse
【論理和(OR)と否定(NOT)を組み合わせる】
boolean a = !true || true; //結果はtrue
boolean b = !true || false; //結果はfalse
boolean c = !false || true; //結果はtrue
boolean d = !false || false; //結果はtrue
【排他的論理和(XOR)と否定(NOT)を組み合わせる】
boolean a = !true ^ true; //結果はtrue
boolean b = !true ^ false; //結果はfalse
boolean c = !false ^ true; //結果はfalse
boolean d = !false ^ false; //結果はtrue
上記は分かりやすいようにリテラルで記載していますが、通常は変数で演算を行います。
boolean a = true;
boolean b = true;
boolean c = !a && b; //結果はfalse
もっというと、普通は比較演算や条件分岐と組み合わせて使われます。
String name = "山田太郎";
String address = "東京都";
//東京都の山田太郎さんならXXの処理をする
if((name == "山田太郎") && (address == "東京都")){
System.out.println("東京都の山田太郎さんの処理");
}
「&」や「|」の処理について
「&&」や「||」の代わりに、「&」や「|」を使うこともできますが、通常は論理演算として「&」や「|」は使うことは無いです。
- 「&」や「|」はビット演算子なので、論理演算子としての役割とはちょっと違います。
trueとfalseの定義ですが、javaの内部では「1」と「0」で認識されていると思われます。(バイト数は不明です)
仮に1バイトだとして
true: 0xb00000001
false: 0xb00000000
だった場合、
0xb00000001 & 0xb00000001 は 0xb00000001(true)
0xb00000000 & 0xb00000001 は 0xb00000000(false)
0xb00000001 & 0xb00000000 は 0xb00000000(false)
0xb00000000 & 0xb00000000 は 0xb00000000(false)
0xb00000001 | 0xb00000001 は 0xb00000001(true)
0xb00000000 | 0xb00000001 は 0xb00000001(true)
0xb00000001 | 0xb00000000 は 0xb00000001(true)
0xb00000000 | 0xb00000000 は 0xb00000000(false)
となり、「&&」や「||」と同じ結果となります。
「&」や「|」と「&&」や「||」で何が違うかというと、条件判定時に条件が成立していた場合の挙動が違います。
例えば、
boolean a = true(①) || false(②);
という式があった場合、①がtrueの時点で結果が確定するので、②の値を評価せずにaに結果を格納します。
しかし、
boolean a = true(①) | false(②);
という式の場合、ビット演算をするため①と②の値を計算して結果をaに代入する動きになります。
論理演算子については以上です。