2010-11-14 15 views
21

Moje pytanie wykorzystuje Javę jako przykład, ale myślę, że dotyczy to prawdopodobnie wszystkich.Jaka jest różnica między XOR i NOT-EQUAL-TO?

Czy jest jakaś praktyczna różnica między operatorem XOR (^ w java) i NOT-EQUAL-TO (! = W java), przy porównywaniu wartości logicznych?

Oceniam tu rzeczy, ale wciąż się zastanawiałem (wydaje się dziwne, dwie rzeczy równe) ... i nie znalazłem niczego w sieci. Tylko jedna dyskusja na jakimś forum, która zakończyła się szybko, bez żadnych rezultatów.

+0

Niektóre powiązane dyskusje w tym pytaniu (osobiście nie uważam tego za duplikat, na osobę): http://stackoverflow.com/questions/160697/is-it-good-practice-to-use-the- xor-operator-in-java-for-boolean-checks – eldarerathis

+0

Notatka styczna: Jak powiedziano w poniższych odpowiedziach, dwa operatory oznaczają to samo dla booleans. Nie jest to prawdą w ogólnym przypadku, przynajmniej w C++. Ponieważ operatory mogą być przeciążone w C++, operatory '! =' I '^' mogą lub nie mogą zrobić to samo. Poza tym użycie '! =' W przeciwieństwie do '^' sprawia, że ​​jest raczej jasne, że wykonywany jest test nierówności. –

+0

Przykro mi, nie widziałem nawet tego pytania, może dlatego, że tytuły są inne i weryfikator pytań go nie wykrył. W każdym razie odpowiedzi tutaj były o wiele lepsze i oświecone, w mojej skromnej opinii. O tym, co tam powiedziano ... Zgadzam się: jeśli masz zamiar zapisać jedną z kilku liter, które pozostawiają kod bardziej niejasny, wolę gadać. Będę trzymać się! = W takich sytuacjach. – davidcesarino

Odpowiedz

26

Dla wartości logicznych, to oznacza to samo - chociaż istnieje związek operator przypisania dla XOR:

x ^= y; 

Nie ma odpowiednik przypisanie związek operator nierówności.

Co do tego, dlaczego są one dostępne - byłoby dziwne, że XOR , a nie, będzie dostępne tylko dlatego, że działa tak samo jak nierówność. Powinno to być logiczne, więc tak jest. W przypadku typów innych niż boolowskie wynik jest inny, ponieważ jest to inny typ wyniku, ale to nie znaczy, że byłoby sensowne usunięcie XOR dla boolean.

+0

Tak, to były dokładnie moje myśli! Chciałem tylko upewnić się, ponieważ ogólnie rzecz biorąc nie widzę wielu rzeczy, które są w zasadzie takie same, służąc w tym samym celu (brzmiąca jak Ockhama ...). Ta troska oczywiście nie dotyczy trójskładnikowego, co jest oczywiście lepszym sposobem i czystszym sposobem na zrobienie tego samego. Ale z moim przypadkiem tutaj jest naprawdę tak samo. Ale tak, masz rację co do kwestii i mojego pytania. Dziękuję Ci. – davidcesarino

0

Powinny one być zasadniczo takie same w tym przypadku.

0

Jest duża różnica, XOR działa na poziomie bitów, zachowując różnice jak te, tak 0b0011 xor 0b1101 => 0b1110

chodzi, // t

+4

ah, porównując booleans ... Nie, nie ma różnicy .. – Teson

3

Tak, można użyć XOR do testuj wartości logiczne dla równości (in), chociaż kod jest mniej intuicyjny: if (x^y) versus if (x != y).

3

Przy wartościach logicznych nie powinno być różnicy. Powinieneś wybrać tę, która jest bardziej odpowiednia dla twojego zmysłu działania.

Przykład:

bool oldChoice = ...; 
bool newChoice = ...; 
if (oldChoice != newChoice) 
    ... 

Tutaj XOR da taki sam wynik, ale nie będzie odzwierciedlać prawdziwy kod intencji.

19

Jak stwierdzono w Java Language Specification:

Wynik = false jeśli argumenty są zarówno prawdziwe lub oba fałszywe; w przeciwnym razie wynik jest prawdziwy. Zatem! = Zachowuje się tak samo jak^(§15.22.2) po zastosowaniu do operandów logicznych.

Ponadto jeśli spróbujesz patrząc na kod bajtowy prostego fragmentu:

void test(boolean b1, boolean b2) { 
    boolean res1 = b1^b2; 
    boolean res2 = b1!=b2; 
} 

uzyskać:

test(ZZ)V 
    L0 
    LINENUMBER 45 L0 
    ILOAD 1 
    ILOAD 2 
    IXOR 
    ISTORE 3 
    L1 
    LINENUMBER 46 L1 
    ILOAD 1 
    ILOAD 2 
    IXOR 
    ISTORE 4 
    L2 
    LINENUMBER 47 L2 
    RETURN 
    L3 

Zapewnia to, że oprócz samych semantyki, nie ma żadnego faktyczna praktyczna różnica w realizacji. (Można również zobaczyć, że wewnętrznie ints są używane do przechowywania wartości logicznych)

+0

Dziękuję bardzo za to głębokie wyjaśnienie, jak to działa! – davidcesarino

Powiązane problemy