Frage

Bemerkungen:

Java hat einen logischen UND-Operator.
Java hat eine logische OR-Operator.
Java hat einen logischen NOT-Operator.

Problem:

Java hat keinen logischen XOR-Operator, nach Sonne . Ich möchte ein definieren.

Methode Definition:

Als ein Verfahren ist es einfach wie folgt definiert:

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


Methodenaufruf:

Diese Methode wird in der folgenden Art und Weise genannt:

boolean myVal = logicalXOR(x, y);


Operator Verwendung:

Ich würde viel lieber einen Operator haben, wie folgt verwendet:

boolean myVal = x ^^ y;


Frage:

Ich kann nichts finden, wie Sie gehen über einen neuen Operator in Java definieren. Wo soll ich anfangen?

War es hilfreich?

Lösung

Java einen logischen XOR-Operator hat , es ist ^ (wie in a ^ b).

Abgesehen davon, können Sie keine neue Operatoren in Java definieren.

Edit: Hier ein Beispiel:

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

Ausgabe:

false ^ false = false
false ^ true = true
true ^ false = true
true ^ true = false

Andere Tipps

Ist es nicht x! = Y?

  

Java hat einen logischen UND-Operator.
  Java hat einen logischen OR-Operator.

Falsch.

Java hat

  • zwei logische UND-Operatoren: normal und ist & und Kurzschluss und ist && und
  • zwei logische OR-Operatoren: normal OR | und Kurzschluss oder ist ||.

XOR existiert nur als ^, weil Kurzauswertung nicht möglich ist.

Vielleicht mißverstanden Sie den Unterschied zwischen & und &&, | und || Der Zweck der Verknüpfung Operatoren && und || ist, dass der Wert des ersten Operanden das Ergebnis bestimmen kann und so der zweite Operand muss nicht bewertet werden.

Dies ist besonders nützlich, wenn der zweite Operand würde zu einem Fehler führt. z.

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

Allerdings mit XOR , Sie immer den zweiten Operanden haben zu bewerten, um das Ergebnis zu erhalten, so dass die einzige sinnvolle Operation ^ ist.

Sie können einfach schreiben (a!=b)

Dies würde die gleiche wie Art und Weise, wie a ^ b arbeitet.

Das ist, weil Betreiber Überlastung etwas ist, dass sie absichtlich aus der Sprache, die speziell nach links. Sie „betrogen“ ein wenig mit String-Verkettung, aber darüber hinaus, dass eine solche Funktionalität nicht vorhanden.

(Disclaimer: Ich habe nicht mit dem letzten 2 Major-Releases von Java gearbeitet, so dass, wenn es in jetzt ist, werde ich sehr überrascht sein)

Der einzige Operator in Java Überlastung ist + auf Strings ( JLS 15.18.1 String Verkettungsoperator + ).

Die Gemeinschaft hat in drei Jahren aufgeteilt, 1/3 es nicht wollen, 1/3 will es, und 1/3 kümmert sich nicht darum.

Sie können Unicode verwenden, um Methodennamen zu erstellen, die Symbole sind ... also, wenn Sie ein Symbol haben Sie verwenden möchten Sie Mýval = x tun könnte $ (y). wobei $ ist das Symbol und x ist nicht ein primitives ... aber die in einigen Editoren wird vertrackt sein und die Begrenzung ist, da Sie es auf einem primitiven nicht tun können.

Der folgende Code:

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

ist überflüssig.

Warum nicht schreiben:

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

Auch als javashlook sagte , gibt es bereits ^ Operator.

!= und ^ Arbeit identisch * für Boolesche Operanden (Ihr Fall ist), aber unterschiedlich für Integer-Operanden.

* Anmerkungen:
1. Sie arbeiten identisch für boolean (Urtyp), aber nicht Boolean (Objekttyp) Operanden. Als Boolean (Objekttyp) Werte Wert null haben. Und != kehrt false oder true wenn eine oder beide seiner Operanden null sind, während ^ NullPointerException in diesem Fall werfen.
2. Obwohl sie identisch arbeiten, sie haben unterschiedliche Priorität, z.B. wenn sie mit & verwendet: a & b != c & d wird als a & (b != c) & d behandelt werden, während a & b ^ c & d als (a & b) ^ (c & d) behandelt werden. (offtopic: autsch, C-Stil Präzedenztabelle saugt)

Hier ist ein var arg XOR-Methode für java ...

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

Genießen

Sie können mit Xtend (Infixoperatoren und Überladen von Operatoren) Überlastung Betreiber und ‚Aufenthalt‘ auf Java

Was Sie fordern würde nicht viel Sinn machen. Es sei denn, ich bin falsch Sie darauf hindeutet, dass Sie XOR verwenden, um logische Operationen die gleiche Art und Weise AND und OR tun durchführen. Ihre bereitgestellten Code tatsächlich zeigt, was ich reffering an:

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

Ihre Funktion hat boolean-Eingänge, und wenn bitweise XOR auf booleans verwendet wird, das Ergebnis ist das gleiche wie der Code, den Sie zur Verfügung gestellt haben. Mit anderen Worten, ist bitweise XOR bereits effizient, wenn einzelne Bits (booleans) zu vergleichen oder die einzelnen Bits in größeren Werten zu vergleichen. Um dies in Zusammenhang zu bringen, in Bezug auf den binären Werten jeden nicht-Null-Wert ist TRUE und nur ZERO ist falsch.

Also für XOR die gleiche Art und Weise Logical AND angelegt werden, würden Sie entweder nur binäre Werte verwenden, mit nur einem Bit oder den binären Wert (das gleiche Ergebnis und Effizienz geben) hätte als Ganzes bewertet werden statt pro Bit. Mit anderen Worten: der Ausdruck (010 ^^ 110) = FALSE statt (010 ^^ 110) = 100. Das meiste der semantischen Bedeutung aus dem Betrieb entfernen würde, und stellt einen logischen Test sollten Sie sowieso nicht verwenden werden.

logische Exklusiv-oder in Java != genannt wird. Sie können auch ^ verwenden, wenn Sie Ihre Freunde verwirren wollen.

A und B würden Boolesche Werte werden zu lassen! = Die gleichen wie xor, so dass die Wahrheitstabelle gleich aussehen würde. Sie können auch verwenden! (A == B) lol.

Ich bin mit der sehr populären Klasse "org.apache.commons.lang.BooleanUtils"

Diese Methode wird von vielen Benutzern und sicher getestet. Habe Spaß. Verbrauch:

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

Da boolean Datentyp wie eine ganze Zahl gespeichert ist, Bit-Operator ^ Funktionen wie eine XOR-Operation, wenn mit Boolesche Werte verwendet.

//©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
            */
        }
    }

Hier ist ein Beispiel:

Bei 2 int Werte, return true, wenn man negativ ist und man ist positiv. Außer, wenn der Parameter „negativer“ wahr ist, dann true zurück, nur wenn beide negativ sind.

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

Sie müssen Scala wechseln Ihre eigenen Operatoren zu implementieren

Rohr Beispiel

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top