Czy istnieje operator XNOR (Logical biconditional) w C #?


136

Jestem nowy w C # i nie mogę znaleźć operatora XNOR , aby podać tę tabelę prawdy:

aba XNOR b
----------------
TTT
TFF
FTF
FFT

Czy jest do tego konkretny operator? Albo muszę użyć! (A ^ B)?


94
Ten operator jest bardziej znany jako ==operandy boolowskie ...
Magnus Hoff,

@Magnus Hoff: ładny, bardzo ładny punkt!
sll

24
Myślę, że wyrażenie „nie widzę drewna dla drzew” jest tutaj bardzo odpowiednie. Głosowanie, ponieważ wszyscy byliśmy tu raz lub dwa;)
spędziliśmy

1
Może OP iz l33t k! D, który chce napisać niesamowity kod szelkowy i musi jakoś ukryć operację porównania. Jest taka możliwość ...
Kerrek SB,

4
przepraszam, Kerrek, nie jestem z tego tłumu. A spender jest całkiem tutaj -)
trailmax

Odpowiedzi:


250

XNOR to po prostu równość wartości logicznych; używać A == B.

Łatwo to przeoczyć, ponieważ równość nie jest powszechnie stosowana do wartości logicznych. Są języki, w których to niekoniecznie będzie działać. Na przykład w języku C każda niezerowa wartość skalarna jest traktowana jako prawda, więc dwie „prawdziwe” wartości mogą być nierówne. Ale pytanie zostało oznaczone, która ma, powiedzmy, grzeczne wartości logiczne.

Zauważ również, że nie jest to uogólnione na operacje bitowe, gdzie chcesz 0x1234 XNOR 0x5678 == 0xFFFFBBB3(zakładając 32 bity). W tym celu musisz wykorzystać inne operacje, takie jak ~(A^B). (Uwaga: ~nie !.)


6
W C, !operator może użyć do przeprowadzenia int„S«do dobrze zachowujących»logicznych: !a==!b.
ivan_pozdeev

2
@ivan_pozdeev I !!(to dwa logiczne operatory „nie”) normalizuje dowolną wartość skalarną do 0lub 1.
Keith Thompson

5

XOR = A lub B, ale nie A i B lub żadne (nie może być równe [! =])
XNOR jest zatem dokładnym przeciwieństwem i można go łatwo przedstawić za pomocą == lub ===.

Jednak przypadki inne niż boolowskie stwarzają problemy, jak w tym przykładzie:

a = 5
b = 1

if (a == b){
...
}

zamiast tego użyj tego:

a = 5
b = 1

if((a && b) || (!a && !b)){
...
}

lub

if(!(a || b) && (a && b)){
...
}

pierwszy przykład zwróci fałsz (5! = 1), ale drugi zwróci prawdę (wartości a [wartość?] i b [wartość?] zwracają tę samą wartość logiczną, prawda (wartość = nie 0 / istnieje wartość )

przykład alt jest po prostu odwróconą bramką (a || b) &&! (a && b) (XOR)


3

Nie, musisz użyć !(A^B)

Chociaż przypuszczam, że możesz użyć przeciążenia operatorów, aby stworzyć własny XNOR.


1
To jest bitowe, a nie logiczne
sll

Myślę, że plakat wie o tym, ponieważ zamieścił to w swoim pytaniu.
Griffin

4
@sllev prawie mnie dostałeś, musiałem to dwukrotnie sprawdzić. W C # ^ jest logiczne, jeśli działa na boolowskim. Jeśli jest obsługiwany na typach całkowitych, jest bitowy. Proszę zobaczyć msdn.microsoft.com/en-us/library/zkacc7k1.aspx
trailmax

@trailmax: fajne rzeczy, dzięki za wskazanie tego! Naprawdę diabeł tkwi w szczegółach!
sll

-6

Możesz użyć ===operatora dla XNOR. Wystarczy przekonwertować ai bbool.

if (!!a === !!b) {...}

1
tylko C # nie ma ===operatora
trailmax

żadna z tych odpowiedzi nie jest poprawna, ===operatorem bez przymusu jest javascript, a podwójna !!wartość przed wartością w ocenie nie jest poprawna w c #
Remi

jak już wspomniano, C # nie ma operatora potrójnego znaku równości.
cramopy

=== nie jest operatorem w C # ... (===) używany jest JavaScript.
Darkcoder
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.