Beobachtungen:
Java hat einen logischen UND-Operator.
Java hat einen logischen ODER-Operator.
Java hat einen logischen NOT-Operator.
Problem:
Laut Sun hat Java keinen logischen XOR-Operator . Ich möchte einen definieren.
Methodendefinition:
Als Methode wird es einfach wie folgt definiert:
public static boolean logicalXOR(boolean x, boolean y) {
return ( ( x || y ) && ! ( x && y ) );
}
Methodenaufruf:
Diese Methode wird folgendermaßen aufgerufen:
boolean myVal = logicalXOR(x, y);
Bedienerbetrieb:
Ich hätte viel lieber einen Operator, der wie folgt verwendet wird:
boolean myVal = x ^^ y;
Frage:
Ich kann nichts darüber finden, wie man einen neuen Operator in Java definiert. Wo soll ich anfangen?
!=
, es gibt auch eine logische XNOR namens==
Antworten:
Java hat einen logischen XOR-Operator , es ist ^ (wie in
a ^ b
).Abgesehen davon können Sie in Java keine neuen Operatoren definieren.
Bearbeiten: Hier ist ein Beispiel:
Ausgabe:
quelle
Ist es nicht x! = Y?
quelle
a != b != c
es nicht funktioniert, abera ^ b ^ c
wird? In diesem Fall liegen Sie falsch .new Boolean(true) != new Boolean(true)
gibttrue
.Falsch.
Java hat
XOR existiert nur als ^, da eine Kurzschlussauswertung nicht möglich ist.
quelle
Vielleicht mißverstanden Sie den Unterschied zwischen
&
und&&
,|
und||
Ziel der Verknüpfung Betreiber&&
und||
sind , dass der Wert des ersten Operanden das Ergebnis bestimmen kann und so der zweite Operand nicht ausgewertet werden muss.Dies ist besonders nützlich, wenn der zweite Operand zu einem Fehler führen würde. z.B
Bei XOR müssen Sie jedoch immer den zweiten Operanden auswerten, um das Ergebnis zu erhalten, sodass die einzig sinnvolle Operation ist
^
.quelle
Du kannst einfach schreiben
(a!=b)
Dies würde genauso funktionieren wie
a ^ b
.quelle
Das liegt daran, dass das Überladen von Operatoren bewusst aus der Sprache herausgelassen wurde. Sie "betrogen" ein bisschen mit String-Verkettung, aber darüber hinaus gibt es solche Funktionen nicht.
(Haftungsausschluss: Ich habe noch nicht mit den letzten beiden Hauptversionen von Java gearbeitet. Wenn es jetzt verfügbar ist, bin ich sehr überrascht.)
quelle
Die einzige Operatorüberladung in Java ist + on Strings ( JLS 15.18.1 String Concatenation Operator + ).
Die Community ist seit Jahren in drei Teile geteilt, 1/3 will es nicht, 1/3 will es und 1/3 kümmert sich nicht darum.
Sie können Unicode verwenden, um Methodennamen zu erstellen, die Symbole sind. Wenn Sie also ein Symbol haben, das Sie verwenden möchten, können Sie myVal = x. $ (Y) ausführen. Dabei ist $ das Symbol und x kein Primitiv ... aber das wird in einigen Editoren zweifelhaft und ist einschränkend, da Sie es auf einem Primitiv nicht tun können.
quelle
Folgendes folgt dein Code:
ist überflüssig.
Warum nicht schreiben:
?
Auch, wie Javashlook sagte , gibt es bereits
^
Betreiber.!=
und^
arbeiten identisch * für boolesche Operanden (Ihr Fall), aber anders für ganzzahlige Operanden.* Hinweise:
1. Sie funktionieren identisch für Operanden
boolean
(primitiver Typ), jedoch nicht fürBoolean
Operanden (Objekttyp). As-Boolean
Werte (Objekttyp) können einen Wert habennull
. Und!=
wird zurückkehrenfalse
odertrue
wenn einer oder beide seiner Operanden sindnull
, während in diesem Fall^
werfenNullPointerException
.2. Obwohl sie identisch arbeiten, haben sie unterschiedliche Vorrang, z. B. wenn sie verwendet werden mit
&
:a & b != c & d
werden behandelt alsa & (b != c) & d
, währenda & b ^ c & d
behandelt werden als(a & b) ^ (c & d)
(offtopic: autsch, C-artige Vorrangtabelle saugt).quelle
!=
Boolean
Werte!=
funktioniert falsch. Fürboolean
Werte ist es ok.Hier ist eine var arg XOR-Methode für Java ...
Genießen
quelle
XOR(true,true,true)
gibt true zurück, was nicht dem entspricht, was Sie von einer aufgerufenen Methode erwarten würdenXOR
. Mein erwartetes Verhalten wäre, dass es immer false zurückgibt (was natürlich nicht hilfreich ist)Logisches Exklusiv-oder in Java wird aufgerufen
!=
. Sie können auch verwenden,^
wenn Sie Ihre Freunde verwirren möchten.quelle
Sie können Xtend (Infix Operators und Operator Overloading) verwenden, um Operatoren zu überladen und auf Java zu bleiben
quelle
^
. Sie müssen verwendenbool_1.xor(bool_2)
. Merkwürdig ist , dass sich der Parser nicht einmal können Sie verwenden die caret; Sie müssenxor
für Boolesche Werte undbitwiseXor
für Ganzzahlen verwenden. Sie könnten natürlich einen anderen Operator überlasten, aber das würde sehr verwirrend werden.Was Sie verlangen, würde nicht viel Sinn machen. Sofern ich nicht falsch liege, schlagen Sie vor, dass Sie XOR verwenden möchten, um logische Operationen auf die gleiche Weise wie AND und OR auszuführen. Ihr bereitgestellter Code zeigt tatsächlich, worauf ich mich beziehe:
Ihre Funktion verfügt über boolesche Eingaben. Wenn bitweises XOR für boolesche Werte verwendet wird, entspricht das Ergebnis dem von Ihnen angegebenen Code. Mit anderen Worten, bitweises XOR ist bereits effizient, wenn einzelne Bits (Boolesche Werte) oder die einzelnen Bits in größeren Werten verglichen werden. Um dies in einen Zusammenhang zu bringen, ist in Bezug auf Binärwerte jeder Wert ungleich Null WAHR und nur NULL ist falsch.
Damit XOR auf die gleiche Weise angewendet wird, wie logisches UND angewendet wird, würden Sie entweder nur Binärwerte mit nur einem Bit verwenden (was das gleiche Ergebnis und die gleiche Effizienz ergibt) oder der Binärwert müsste als Ganzes anstatt pro Bit ausgewertet werden. Mit anderen Worten, der Ausdruck (010 ^^ 110) = FALSE anstelle von (010 ^^ 110) = 100. Dies würde den größten Teil der semantischen Bedeutung aus der Operation entfernen und stellt einen logischen Test dar, den Sie sowieso nicht verwenden sollten.
quelle
A und B müssten boolesche Werte sein, um! = Dasselbe wie xor zu machen, damit die Wahrheitstabelle gleich aussieht. Sie könnten auch verwenden! (A == B) lol.
quelle
Ich benutze die sehr beliebte Klasse "org.apache.commons.lang.BooleanUtils"
Diese Methode wird von vielen Benutzern getestet und ist sicher. Habe Spaß. Verwendungszweck:
quelle
Da der boolesche Datentyp wie eine Ganzzahl gespeichert wird, funktioniert der Bitoperator ^ wie eine XOR-Operation, wenn er mit booleschen Werten verwendet wird.
quelle
Hier ist ein Beispiel:
Geben Sie bei 2 int-Werten true zurück, wenn einer negativ und einer positiv ist. Außer wenn der Parameter "negativ" wahr ist, geben Sie nur dann wahr zurück, wenn beide negativ sind.
quelle
Sie müssen zu Scala wechseln, um Ihre eigenen Operatoren zu implementieren
Rohrbeispiel
quelle