Obserwacje:
Java ma logiczny operator AND.
Java ma logiczny operator OR.
Java ma logiczny operator NOT.
Problem:
Według Sun Java nie ma logicznego operatora XOR . Chciałbym zdefiniować jeden.
Definicja metody:
Jako metodę definiuje się go następująco:
public static boolean logicalXOR(boolean x, boolean y) {
return ( ( x || y ) && ! ( x && y ) );
}
Wywołanie metody:
Ta metoda jest wywoływana w następujący sposób:
boolean myVal = logicalXOR(x, y);
Wykorzystanie operatora:
Wolałbym mieć operatora używanego w następujący sposób:
boolean myVal = x ^^ y;
Pytanie:
Nie mogę nic znaleźć na temat definiowania nowego operatora w Javie. Od czego powinienem zacząć
!=
, istnieje też logiczny XNOR o nazwie==
Odpowiedzi:
Java ma logiczny operator XOR , jest ^ (jak w
a ^ b
).Poza tym nie można definiować nowych operatorów w Javie.
Edycja: Oto przykład:
Wynik:
źródło
Czy to nie x! = Y?
źródło
a != b != c
nie będzie działać, alea ^ b ^ c
będzie? W takim razie się mylisz .new Boolean(true) != new Boolean(true)
dajetrue
.Źle.
Java ma
XOR istnieje tylko jako ^, ponieważ ocena zwarcia nie jest możliwa.
źródło
Być może zrozumiał różnicę między
&
i&&
,|
a||
Zadaniem operatorów skrótów&&
i||
jest to, że wartość pierwszego argumentu można określić rezultat, a więc drugi argument nie musi być ocenione.Jest to szczególnie przydatne, jeśli drugi operand spowoduje błąd. na przykład
Jednak w przypadku XOR zawsze musisz ocenić drugi operand, aby uzyskać wynik, więc jedyną znaczącą operacją jest
^
.źródło
Możesz po prostu pisać
(a!=b)
To działałoby tak samo jak
a ^ b
.źródło
To dlatego, że przeciążanie operatorów jest czymś, co specjalnie pominęli z języka. „Oszukiwali” trochę poprzez łączenie łańcuchów, ale poza tym taka funkcjonalność nie istnieje.
(zrzeczenie się: Nie pracowałem z 2 ostatnimi ważnymi wydaniami Javy, więc jeśli będzie to teraz, będę bardzo zaskoczony)
źródło
Jedynym przeciążeniem operatora w Javie jest + na ciągach ( JLS 15.18.1 Operator konkatenacji ciągów + ).
Społeczność jest podzielona na 3 lata, 1/3 tego nie chce, 1/3 chce, a 1/3 nie obchodzi.
Możesz użyć Unicode do tworzenia nazw metod, które są symbolami ... więc jeśli masz symbol, którego chcesz użyć, możesz zrobić myVal = x. $ (Y); gdzie $ jest symbolem, a x nie jest prymitywne ... ale będzie to podejrzane w niektórych edytorach i jest ograniczone, ponieważ nie można tego zrobić na prymitywie.
źródło
Twój kod:
jest zbyteczny.
Dlaczego nie napisać:
?
Ponadto, jak powiedział javashlook , istnieje już
^
operator.!=
i^
działają identycznie * dla operandów boolowskich (twój przypadek), ale inaczej dla operandów całkowitych.* Uwagi:
1. Działają identycznie dla operandów
boolean
(typ pierwotny), ale nie działająBoolean
(typ obiektu). PonieważBoolean
(typ obiektu) wartości mogą mieć wartośćnull
. I!=
powrócifalse
lubtrue
gdy jeden lub oba operandy będąnull
, podczas gdy w tym przypadku^
rzuciNullPointerException
.2. Chociaż działają identycznie, mają różne pierwszeństwo, np. Gdy są używane z
&
:a & b != c & d
będą traktowane jakoa & (b != c) & d
, podczas gdya & b ^ c & d
będą traktowane jako(a & b) ^ (c & d)
(offtopic: ouch, tabela pierwszeństwa w stylu C jest do bani).źródło
!=
Boolean
wartości!=
działa niepoprawnie. W przypadkuboolean
wartości jest w porządku.Oto metoda var arg XOR dla java ...
Cieszyć się
źródło
XOR(true,true,true)
Zwraca true, co nie wydaje się być tym, czego można oczekiwać od metody o nazwieXOR
. Moim oczekiwanym zachowaniem byłoby to, że zawsze zwraca false (co oczywiście nie jest pomocne)Nazywa się to logiczne wyłączne lub w Javie
!=
. Możesz także użyć,^
jeśli chcesz zmylić znajomych.źródło
Możesz użyć Xtend (Infix Operators and Operator Overloading) do przeciążenia operatorów i „pozostania” na Javie
źródło
^
; musisz użyćbool_1.xor(bool_2)
. Co dziwne, analizator składni nie pozwala nawet na użycie kursora; musisz użyćxor
dla wartości logicznych ibitwiseXor
liczb całkowitych. Oczywiście możesz przeciążyć innego operatora, ale byłoby to bardzo mylące.To, o co prosisz, nie miałoby większego sensu. O ile się nie mylę, sugerujesz, że chcesz używać XOR do wykonywania operacji logicznych w taki sam sposób, jak AND i OR. Podany kod pokazuje, o co mi chodzi:
Twoja funkcja ma dane logiczne, a gdy bitowa XOR jest używana na boolach, wynik jest taki sam, jak podany kod. Innymi słowy, bitowe XOR jest już wydajne podczas porównywania pojedynczych bitów (booleanów) lub porównywania pojedynczych bitów w większych wartościach. Aby umieścić to w kontekście, pod względem wartości binarnych każda niezerowa wartość ma wartość PRAWDA, a tylko ZERO jest fałszem.
Tak więc, aby XOR mógł być zastosowany w taki sam sposób, jak logiczny AND, albo użyłbyś tylko wartości binarnych z jednym bitem (dając ten sam wynik i wydajność), albo wartość binarna musiałaby być oceniana jako całość zamiast na bit. Innymi słowy, wyrażenie (010 ^^ 110) = FAŁSZ zamiast (010 ^^ 110) = 100. To usunie większość znaczenia semantycznego z operacji i reprezentuje logiczny test, którego i tak nie powinieneś używać.
źródło
A i B musiałyby być wartościami logicznymi, aby! = Taki sam jak xor, aby tablica prawdy wyglądała tak samo. Możesz także użyć! (A == B) lol.
źródło
Korzystam z bardzo popularnej klasy „org.apache.commons.lang.BooleanUtils”
Ta metoda jest testowana przez wielu użytkowników i bezpieczna. Baw się dobrze. Stosowanie:
źródło
Ponieważ typ danych logicznych jest przechowywany jak liczba całkowita, operator bitowy ^ działa jak operacja XOR, jeśli jest używany z wartościami logicznymi.
źródło
Oto przykład:
Biorąc pod uwagę 2 wartości int, zwróć true, jeśli jedna jest ujemna, a druga dodatnia. Z wyjątkiem sytuacji, gdy parametr „przeczący” jest prawdziwy, zwróć wartość prawdy tylko wtedy, gdy oba są ujemne.
źródło
musisz przełączyć się na Scala, aby wdrożyć własnych operatorów
przykład rury
źródło