web-dev-qa-db-ja.com

Javaのifブロックで論理演算子とビット演算子を使用することに違いはありますか?

次のifブロックの両方の内容を実行する必要があります。

if( booleanFunction() || otherBooleanFunction() ) {...}
if( booleanFunction() | otherBooleanFunction() ) {...}

では、|を使用することと||を使用することの違いは何ですか?

注:私はこれを調べて、以下に含めた自分の答えを見つけました。お気軽に訂正するか、ご意見をお聞かせください。確かに改善の余地があります!

14
Miquel

論理演算子はブール値で機能し、ビット演算子はビットで機能します。この場合、効果は同じになりますが、2つの違いがあります。

  1. ビット単位の演算子はそのためのものではないため、読みにくくなりますが、最も重要なのは
  2. 論理OR演算子は最初の条件を評価します。それが真の場合、次の条件が何になるかは関係ありません。結果は真になるので、2番目の句はそうではありません)実行

これを証明するための便利なコードを次に示します。

public class OperatorTest {

    public static void main(String[] args){
        System.out.println("Logical Operator:");
        if(sayAndReturn(true, "first") || sayAndReturn(true, "second")){
            //doNothing
        }

        System.out.println("Bitwise Operator:");
        if(sayAndReturn(true, "first") | sayAndReturn(true, "second")){
            //doNothing
        }
    }

    public static boolean sayAndReturn(boolean ret, String msg){
        System.out.println(msg);
        return ret;
    }
}
14
Miquel

2つの用途は異なります。多くの場合(ブール値を処理する場合)、同じ効果があるように見える場合がありますが、論理ORは短絡であることに注意することが重要です。つまり、最初の引数がtrueと評価された場合、2番目の引数が残されます。未評価。ビット演算子は、関係なく両方の引数を評価します。

同様に、論理積は短絡です。つまり、最初の引数がfalseと評価された場合、2番目の引数は未評価のままになります。繰り返しますが、ビット単位のANDはそうではありません。

あなたはここでこれが実際に動いているのを見ることができます:

int x = 0;
int y = 1;
System.out.println(x+y == 1 || y/x == 1);
System.out.println(x+y == 1 |  y/x == 1);

最初の引数がtrueと評価されるため、最初のprintステートメントは正常に機能し、trueを返します。したがって、評価は停止します。 2番目のprintステートメントは短絡ではないためエラーになり、ゼロによる除算が発生します。

38
arshajii

プログラマーにとって、違いは1つだけです。

  1. 論理演算子は論理演算子です。 1つの条件のみをテストし、それに基づいて結果を取得します。

booleanFunction()|| otherBooleanFunction()いずれかがtrueの場合、trueになります。同様に、booleanFunction()&& otherBooleanFunction()のいずれかがfalseの場合、falseになります。だから、なぜ他のものをテストするのですか。それが論理演算子が行うことです。

しかし、ビット単位のものは両方をチェックします。この概念の頻繁な適用は次のとおりです。

if(someObject != null && someObject.somemethod())

したがって、この場合、&&&に置き換えると、災害が発生するのを待ちます。すぐに厄介なNullPointerExceptionが発生します...

7
Ahmad
_if( booleanFunction() || otherBooleanFunction() ) {...}
_

この状態で、booleanFunction()trueを返すと、otherBooleanFunction()は実行されません。

_if( booleanFunction() | otherBooleanFunction() ) {...}
_

ただし、ビット演算子では、booleanFunction()otherBooleanFunction()の両方の関数が実行されます。booleanFunction()trueまたはfalseを返します。

4
Pramod Kumar

ビット単位と論理演算子の違い-1。ビット単位の演算子はビットで機能しますが、論理演算子はステートメントで機能します。 2.ビット単位で&で表されますが、論理で&&で表されます。 3.ビット単位または|で表されます一方、論理またはは||で表されます。

0
Rajeev jha