Gibt es einen XNOR-Operator (Logical Biconditional) in C #?

136

Ich bin neu in C # und konnte keinen XNOR- Operator finden, der diese Wahrheitstabelle bereitstellt:

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

Gibt es dafür einen bestimmten Operator? Oder muss ich verwenden! (A ^ B)?

Trailmax
quelle
94
Dieser Operator ist allgemein bekannt als ==für boolesche Operanden ...
Magnus Hoff
@Magnus Hoff: schöner sehr schöner Punkt!
sll
24
Ich denke, der Satz "Ich kann den Wald vor lauter Bäumen nicht sehen" ist hier sehr passend. Abstimmung, weil wir alle ein- oder zweimal hier waren;)
Spender
1
Vielleicht ist das OP iz l33t k! D, der fantastischen Shellcodez schreiben will und die Vergleichsoperation irgendwie verbergen muss. Es ist eine Möglichkeit ...
Kerrek SB
4
Entschuldigung, Kerrek, ich bin nicht aus dieser Menge. Und Spender ist hier ganz richtig -)
Trailmax

Antworten:

250

XNOR ist einfach Gleichheit auf Booleschen Werten. verwenden A == B.

Dies ist leicht zu übersehen, da Gleichheit normalerweise nicht auf Boolesche Werte angewendet wird. Und es gibt Sprachen, in denen es nicht unbedingt funktioniert. In C wird beispielsweise jeder Skalarwert ungleich Null als wahr behandelt, sodass zwei "wahre" Werte ungleich sein können. Aber die Frage wurde markiert, die, sollen wir sagen, gut erzogene Boolesche Werte hat.

Beachten Sie auch, dass dies nicht auf bitweise Operationen verallgemeinert wird, bei denen Sie möchten 0x1234 XNOR 0x5678 == 0xFFFFBBB3(unter der Annahme von 32 Bit). Dafür müssen Sie aus anderen Operationen aufbauen, wie z ~(A^B). (Hinweis: ~nicht !.)

Keith Thompson
quelle
6
In C kann der !Operator verwendet werden, um int's in "gut erzogene" Boolesche Werte zu konvertieren : !a==!b.
ivan_pozdeev
2
@ivan_pozdeev Und !!(das sind zwei logische "Nicht" -Operatoren) normalisiert jeden Skalarwert auf 0oder 1.
Keith Thompson
5

XOR = A oder B, aber nicht A & B oder keines (Kann nicht gleich sein [! =])
XNOR ist daher der genaue Gegner und kann leicht durch == oder === dargestellt werden.

Nicht-boolesche Fälle stellen jedoch Probleme dar, wie in diesem Beispiel:

a = 5
b = 1

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

Verwenden Sie stattdessen Folgendes:

a = 5
b = 1

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

oder

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

Das erste Beispiel gibt false zurück (5! = 1), das zweite gibt true zurück (a [Wert?] und b [Wert?]. Die Werte geben den gleichen Booleschen Wert zurück, true (Wert = nicht 0 / es gibt einen Wert) )

Das alte Beispiel ist nur das umgekehrte (a || b) &&! (a && b) (XOR) Gatter

Braden Best
quelle
3

Nein, Sie müssen verwenden !(A^B)

Ich nehme an, Sie könnten die Operatorüberladung verwenden, um Ihr eigenes XNOR zu erstellen.

Greif
quelle
1
Dies ist bitweise, keine logische
sll
Ich denke, das Plakat weiß das, da er es in seine Frage aufgenommen hat.
Griffin
4
@sllev du hast mich fast erwischt, ich musste es noch einmal überprüfen. In C # ^ ist es logisch, wenn auf Boolescher Wert gearbeitet wird. Bei Betrieb mit integralen Typen erfolgt dies bitweise. Bitte sehen Sie msdn.microsoft.com/en-us/library/zkacc7k1.aspx
trailmax
@trailmax: cooles Zeug, danke, dass du darauf hingewiesen hast! Wirklich Teufel ist im Detail!
sll
-6

Sie können den ===Operator für XNOR verwenden. Sie müssen nur konvertieren aund bboolen.

if (!!a === !!b) {...}
user7797323
quelle
1
Nur C # hat keinen ===Operator
Trailmax
Keine dieser Antworten ist richtig, ===der nicht erzwungene Operator ist Javascript und das Double !!vor einem Wert in einer Bewertung ist auch in c # nicht gültig
Remi
Wie bereits erwähnt, hat c # keinen Operator mit dreifachem Vorzeichen.
Cramopy
=== ist kein Operatr in C # ... (===) wird JavaScript verwendet.
Darkcoder