web-dev-qa-db-ja.com

Javaでの "排他的論理和"演算子の作成

所見:

Javaには論理AND演算子があります。
Javaには論理OR演算子があります。
Javaには論理否定演算子があります。

問題:

Javaには論理的なXOR演算子がありません Sunによると 。定義したいのですが。

メソッド定義

方法としては、単に次のように定義されています。

public static boolean logicalXOR(boolean x, boolean y) {
    return ( ( x || y ) && ! ( x && y ) );
}


メソッド呼び出し

このメソッドは次のように呼び出されます。

boolean myVal = logicalXOR(x, y);


オペレータの用法:

以下のようにして、私はむしろ演算子が欲しいです。

boolean myVal = x ^^ y;


質問:

Javaで新しい演算子を定義する方法について私は何も見つけることができません。どこから始めればいいですか。

257
eleven81

Javaは論理的なXOR演算子を持っています、それは ^ です( a ^ b).

それ以外に、Javaでは新しい演算子を定義できません。

編集:これが例です:

public static void main(String[] args) {
    boolean[] all = { false, true };
    for (boolean a : all) {
        for (boolean b: all) {
            boolean c = a ^ b;
            System.out.println(a + " ^ " + b + " = " + c);
        }
    }
}

出力:

 false ^ false = false 
 false ^ true = true 
 true ^ false = true 
 true ^ true = false 
656
javashlook

X!= yではありませんか。

294
Maurice Perry

Javaには論理AND演算子があります。
Javaには論理OR演算子があります。

違う。

Javaは持っています

  • 2つの論理AND演算子:通常のANDは&で、短絡のANDは&&です。
  • 2つの論理OR演算子:normal ORは|です。そして短絡ORは||です。

短絡評価は不可能なので、XORは^としてのみ存在します。

71
starblue

おそらく、&&&|||の違いを誤解しています。ショートカット演算子&&および||の目的は、最初のオペランドの値によって結果が決まるため、2番目のオペランドを評価する必要がないことです。

これは、2番目のオペランドがエラーになる場合に特に便利です。例えば.

if (set == null || set.isEmpty())
// or
if (list != null && list.size() > 0)

ただし、XORを使用すると、結果を取得するために常に2番目のオペランドを評価する必要があるため、意味のある操作は^だけです。

31
Peter Lawrey

(a!=b)と書くだけです

これはa ^ bと同じように機能します。

20
Shuliyey

これは、演算子のオーバーロードが故意に言語から除外されているためです。彼らは文字列の連結でちょっと「だました」が、それを超えると、そのような機能は存在しない。

(免責事項:私はJavaの最後の2つのメジャーリリースで作業していないので、もしそれが今であれば、私は非常に驚きます)

9
Kevin Anderson

次のコード

public static boolean logicalXOR(boolean x, boolean y) {
    return ( ( x || y ) && ! ( x && y ) );
}

余計です。

なぜ書きませんか:

public static boolean logicalXOR(boolean x, boolean y) {
    return x != y;
}

また、javashlook 言った として、既に^演算子があります。

!=^は、ブール値のオペランド(あなたの場合)に対しては*同じように動作しますが、整数オペランドに対しては異なります。

* ノート:
1。これらはboolean(プリミティブ型)に対しても同じように機能しますが、Boolean(オブジェクト型)オペランドに対しては機能しません。 Boolean(オブジェクトタイプ)の値は、値nullを持つことができます。また、!=は、そのオペランドの一方または両方がfalseの場合はtrueまたはnullを返します。この場合、^NullPointerExceptionをスローします。
2。それらは同じように働くが、それらは異なる優先順位を有する。 &と共に使用すると、a & b != c & da & (b != c) & dとして扱われますが、a & b ^ c & d(a & b) ^ (c & d)として扱われます(offtopic:ouch、Cスタイルの優先順位表は吸います)。

7
Sasha

Javaにおける唯一の演算子オーバーロードは、文字列に対する+( JLS 15.18.1文字列連結演算子+ )です。

コミュニティは何年にもわたって3つに分割されており、1/3はそれを望んでおらず、1/3はそれを望んでおり、そして1/3は気にしていません。

あなたはシンボルであるメソッド名を作成するためにunicodeを使うことができます...あなたが使いたいシンボルを持っているならあなたはmyVal = x。$(y)をすることができます。 $はシンボルでxはプリミティブではありません...しかし、これはエディタによっては扱いにくいものになり、プリミティブでは実行できないため制限されます。

7
TofuBeer

これは、Java用のvar arg XORメソッドです。

public static boolean XOR(boolean... args) {
  boolean r = false;
  for (boolean b : args) {
    r = r ^ b;
  }
  return r;
}

楽しい

6

あなたは Xtend(中置演算子と演算子オーバーロード) 演算子をオーバーロードしてJavaで「滞在」することができます

2
iga

あなたが求めていることはあまり意味がありません。誤解がない限り、論理演算をANDおよびXORと同じ方法で実行するためにORを使用することをお勧めします。あなたが提供したコードは実際に私が参照しているものを示しています:

public static boolean logicalXOR(boolean x, boolean y) {
    return ( ( x || y ) && ! ( x && y ) );
}

関数にはブール値の入力があり、ブール値でXORが使用されている場合、結果は提供したコードと同じになります。言い換えれば、ビットごとのXORは、個々のビット(ブール値)を比較するとき、または個々のビットをより大きな値で比較するときにはすでに効率的です。これをコンテキストに入れると、バイナリ値に関しては、ゼロ以外の値はTRUEで、ZEROのみが偽です。

したがって、XORを論理ANDの適用方法と同じ方法で適用するには、1ビットのバイナリ値のみを使用するか(同じ結果と効率を得るため)、またはバイナリ値をビットごとではなく全体。言い換えれば、式は(010 ^^ 110)= 100の代わりに(010 ^^ 110)= FALSEとなります。これは、操作から意味上の意味の大部分を取り除きます。

2
user2904660

Javaにおける論理排他的論理和は!=と呼ばれます。友達を混乱させたい場合は^を使用することもできます。

1
Doradus

私はとても人気のあるクラス "org.Apache.commons.lang.BooleanUtils"を使っています。

この方法は多くのユーザーによってテストされており、安全です。楽しむ。使用法:

boolean result =BooleanUtils.xor(new boolean[]{true,false});
1
Adam111p

AとBは、真理値表が同じに見えるように、!= xorと同じにするためにブール値にする必要があります。 !(A == B)を使用することもできます。

1
John Theibert

これが例です:

2つのint値が与えられた場合、1が負で1が正の場合にtrueを返します。パラメータ "negative"がtrueの場合を除き、両方が負の場合にのみtrueを返します。

    public boolean posNeg(int a, int b, boolean negative) {
      if(!negative){
        return (a>0 && b<0)^(b>0 && a<0);
      }
      else return (a<0 && b<0);
    }
0
Shadman Sudipto

ブールデータ型は整数のように格納されるため、ビット演算子^は、ブール値と共に使用するとXOR操作のように機能します。

//©Mfpl - XOR_Test.Java

    public class XOR_Test {
        public static void main (String args[]) {
            boolean a,b;

            a=false; b=false;
            System.out.println("a=false; b=false;  ->  " + (a^b));

            a=false; b=true;
            System.out.println("a=false; b=true;  ->  " + (a^b));

            a=true;  b=false;
            System.out.println("a=true;  b=false;  ->  " + (a^b));

            a=true; b=true;
            System.out.println("a=true; b=true;  ->  " + (a^b));

            /*  output of this program:
                    a=false; b=false;  ->  false
                    a=false; b=true;  ->  true
                    a=true;  b=false;  ->  true
                    a=true; b=true;  ->  false
            */
        }
    }
0
Ledón

あなた自身の演算子を実装するためにScalaに切り替える必要があるでしょう

パイプの例

0
mut1na