【Javaの基礎】Javaの演算子(論理演算子)

 

こんにちは、現役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に代入する動きになります。

 

論理演算子については以上です。