289

観察:

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

問題:

sunによると、Javaには論理XOR演算子がありません。1つ定義したいと思います。

メソッド定義:

メソッドとして、それは単純に次のように定義されます。

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


メソッド呼び出し:

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

boolean myVal = logicalXOR(x, y);


演算子の使用法:

次のように使用される演算子が必要です。

boolean myVal = x ^^ y;


質問:

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

4

19 に答える 19

736

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);
        }
    }
}

出力:

偽 ^ 偽 = 偽
偽 ^ 真 = 真
真 ^ 偽 = 真
真 ^ 真 = 偽
于 2009-04-07T17:02:55.747 に答える
323

x!= yではないですか?

于 2009-04-07T17:04:41.903 に答える
76

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

間違い。

Javaには

  • 2つの論理AND演算子:通常のANDは&であり、短絡ANDは&&であり、
  • 2つの論理OR演算子:通常のORは| 短絡ORは||です。

短絡評価ができないため、XORは^としてのみ存在します。

于 2009-04-07T18:10:41.090 に答える
34

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

これは、2番目のオペランドでエラーが発生する場合に特に役立ちます。例えば

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

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

于 2009-04-07T20:39:58.750 に答える
9

これは、演算子のオーバーロードが、意図的に言語から除外されたものであるためです。彼らは文字列の連結で少し「だまされた」が、それ以上の機能は存在しない.

(免責事項: 私は Java の最後の 2 つのメジャー リリースを扱っていないので、今リリースされている場合は非常に驚かれることでしょう)

于 2009-04-07T17:02:04.733 に答える
7

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

コミュニティは何年もの間 3 つに分かれており、1/3 はそれを望まず、1/3 はそれを望んでおり、1/3 は気にしていません。

ユニコードを使用して、シンボルであるメソッド名を作成できます...したがって、使用したいシンボルがある場合は、 myVal = x.$(y); を実行できます。ここで、$ はシンボルで、x はプリミティブではありません... しかし、一部のエディターでは危険であり、プリミティブでは実行できないため制限されています。

于 2009-04-07T17:13:44.050 に答える
6

Here is a var arg XOR method for java...

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

Enjoy

于 2012-11-28T21:07:34.707 に答える
2

Xtend (中置演算子と演算子のオーバーロード)を使用して演算子をオーバーロードし、Java に「とどまる」ことができます

于 2012-10-24T09:24:25.023 に答える
2

あなたが求めていることはあまり意味がありません。私が間違っていない限り、XOR を使用して AND や OR と同じように論理演算を実行することを提案しています。提供されたコードは、実際に私が言及していることを示しています:

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

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

したがって、論理積が適用されるのと同じ方法で XOR を適用するには、バイナリ値を 1 ビットのみで使用するか (同じ結果と効率が得られます)、バイナリ値をビットごとではなく全体として評価する必要があります。つまり、( 010 ^^ 110 ) = 100 の代わりに ( 010 ^^ 110 ) = FALSE という式を使用します。これにより、操作からほとんどの意味論的意味が取り除かれ、とにかく使用してはならない論理テストが表されます。

于 2016-10-25T22:21:51.117 に答える
1

真理値表が同じに見えるように、!= を xor と同じにするために、A と B はブール値でなければなりません。!(A==B) 笑を使用することもできます。

于 2017-06-06T15:14:11.780 に答える
0

ブール データ型は整数のように格納されるため、ビット演算子 ^ は、ブール値で使用すると 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
            */
        }
    }
于 2015-03-09T02:14:04.723 に答える
0

次に例を示します。

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);
    }
于 2016-10-21T04:42:09.903 に答える