論理対ビットごとのOR演算子
1. 序章
コンピュータプログラミングでは、ORの使用例は、ブール論理の論理構造、またはビットレベルでデータを操作するためのビット単位の数学演算のいずれかです。
論理演算子は特定の条件に基づいて決定を行うために使用され、ビット演算子はIPアドレスマスキングを含む高速バイナリ計算に使用されます。
このチュートリアルでは、||で表される論理およびビットごとのOR演算子について学習します。 および| それぞれ。
2. 論理ORの使用
2.1. 使い方
論理OR演算子は、ブールオペランドで機能します。 は、オペランドの少なくとも1つが
- true || true = true
- true || false = true
- false || true = true
- false || false = false
2.2. 例
いくつかのboolean変数を使用して理解しましょう。
boolean condition1 = true;
boolean condition2 = true;
boolean condition3 = false;
boolean condition4 = false;
2つのtrueオペランドに論理ORを適用すると、結果はtrueになります。
boolean result = condition1 || condition2;
assertTrue(result);
1つのtrueと1つのfalseオペランドに論理ORを適用すると、結果はtrueになります。
boolean result = condition1 || condition3;
assertTrue(result);
また、2つの false オペランドに論理ORを適用すると、結果はfalseになります。
boolean result = condition3 || condition4;
assertFalse(result);
複数のオペランドがある場合、評価は左から右に効果的に実行されます。 したがって、式 condition1 || 条件2|| 条件3|| condition4 は、次と同じロジックになります。
boolean result1 = condition1 || condition2;
boolean result2 = result1 || condition3;
boolean finalResult = result2 || condition4;
assertTrue(finalResult);
ただし、実際には、Javaは上記の式にショートカットを使用できます。
3. 短回路
論理OR演算子には、短絡動作があります。 これは、オペランドの1つが true と評価されるとすぐに、残りのオペランドを評価せずにtrueを返すことを意味します。
次の例を考えてみましょう。
boolean returnAndLog(boolean value) {
System.out.println("Returning " + value);
return value;
}
if (returnAndLog(true) || returnAndLog(false)) {
}
Output:
Returning true
if (returnAndLog(false) || returnAndLog(true)) {
}
Output:
Returning false
Returning true
ここでは、前の条件が true の場合、2番目の論理条件が評価されないことがわかります。
呼び出されたメソッドのいずれかに副作用がある場合、これは予期しない結果につながる可能性があることに注意してください。 ifステートメントの前にboolean値をキャプチャするように最初の例を書き直すと、異なる結果が得られます。
boolean result1 = returnAndLog(true);
boolean result2 = returnAndLog(false);
if (result1 || result2) {
}
Output:
Returning true
Returning false
4. ビットごとのORの使用
4.1. 使い方
ビットごとのORは二項演算子であり、 it は、2つの整数オペランドの対応する各ビットのORを評価します。 ビットの少なくとも1つが1の場合は1を返し、それ以外の場合は0を返します。 また、この演算子は常に両方のオペランドを評価します。
- 1 | 1 = 1
- 1 | 0 = 1
- 0 | 1 = 1
- 0 | 0 = 0
したがって、2つの整数にビットごとのORを適用すると、結果は新しい整数になります。
4.2. 例
例を考えてみましょう:
int four = 4; //0100 = 4
int three = 3; //0011 = 3
int fourORthree = four | three;
assertEquals(7, fourORthree); // 0111 = 7
次に、上記の操作がどのように機能するかを見ていきます。
まず、各整数がそのバイナリ表現に変換されます。
- 4のバイナリ表現は0100です。
- 3のバイナリ表現は0011です。
次に、それぞれのビットのビットごとのORが評価され、最終結果を表すバイナリ表現に到達します。
0100
0011
----
0111
ここで、 0111 を小数表現に戻すと、最終結果は整数7になります。
複数のオペランドがある場合、評価は左から右に行われます。 したがって、式 1 | 2 | 3 | 4は次のように評価されます。
int result1 = 1 | 2;
int result2 = result1 | 3;
int finalResult = result2 | 4;
assertEquals(finalResult,7);
5. 互換性のあるタイプ
このセクションでは、これらの演算子が互換性のあるデータ型を見ていきます。
5.1. 論理和
論理OR演算子は、ブールオペランドでのみ使用できます。 また、整数オペランドで使用すると、コンパイルエラーが発生します。
boolean result = 1 || 2;
Compilation error: Operator '||' cannot be applied to 'int', 'int
5.2. ビットごとのOR
整数オペランドに加えて、ビット単位のORはブールオペランドでも使用できます。 オペランドの少なくとも1つがtrueの場合は、 true を返します。それ以外の場合は、falseを返します。
例でいくつかのboolean変数を使用して理解しましょう。
boolean condition1 = true;
boolean condition2 = true;
boolean condition3 = false;
boolean condition4 = false;
boolean condition1_OR_condition2 = condition1 | condition2;
assertTrue(condition1_OR_condition2);
boolean condition1_OR_condition3 = condition1 | condition3;
assertTrue(condition1_OR_condition3);
boolean condition3_OR_condition4 = condition3 | condition4;
assertFalse(condition3_OR_condition4);
6. 優先順位
他の演算子の中でも、論理およびビット単位のOR演算子の優先順位を確認してみましょう。
- 優先順位の高い演算子:++-* + – / >> <<> <==!=
- ビットごとのAND:&
- ビットごとのOR:|
- 論理積:&&
- 論理OR:||
- 優先順位の低い演算子:? := + =-= * = / = >> = << =
簡単な例は、これをよりよく理解するのに役立ちます。
boolean result = 2 + 4 == 5 || 3 < 5;
assertTrue(result);
論理OR演算子の優先順位が低いことを考慮すると、上記の式は次のように評価されます。
- ((2 + 4)== 5)|| (3 <5)
- そして、(6 == 5)|| (3 <5)
- そして、false || 真実
これにより、結果はtrueになります。
ここで、ビットごとのOR演算子を使用した別の例を考えてみましょう。
int result = 1 + 2 | 5 - 1;
assertEquals(7, result);
上記の式は次のように評価されます。
- (1 + 2)| (5-1)
- そして、3 | 4
したがって、結果は7になります。
7. 結論
この記事では、ブールオペランドと整数オペランドで論理およびビットごとのOR演算子を使用する方法について学習しました。
また、2つの演算子の主な違いと、他の演算子間の優先順位についても説明しました。
いつものように、サンプルコードはGitHubでから入手できます。