Existe-t-il un opérateur XNOR (biconditionnel logique) en C #?

136

Je suis nouveau en C # et je n'ai pas pu trouver l' opérateur XNOR pour fournir cette table de vérité:

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

Y a-t-il un opérateur spécifique pour cela? Ou j'ai besoin d'utiliser! (A ^ B)?

trailmax
la source
94
Cet opérateur est plus connu sous le nom ==d'opérandes booléens ...
Magnus Hoff
@Magnus Hoff: joli très joli point!
sll
24
Je pense que l'expression «ne peut pas voir le bois pour les arbres» est tout à fait appropriée ici. Voter parce que nous sommes tous venus ici une ou deux fois;)
spender
1
Peut-être que l'OP iz l33t k! D qui veut écrire un shellcodez génial et doit en quelque sorte cacher l'opération de comparaison. C'est une possibilité ...
Kerrek SB
4
désolé, Kerrek, je ne suis pas de cette foule. Et dépenser est tout à fait ici -)
trailmax

Réponses:

250

XNOR est simplement l'égalité sur les booléens; utiliser A == B.

C'est une chose facile à manquer, car l'égalité n'est pas couramment appliquée aux booléens. Et il y a des langues où cela ne fonctionnera pas nécessairement. Par exemple, en C, toute valeur scalaire non nulle est traitée comme vraie, donc deux valeurs «vraies» peuvent être inégales. Mais la question a été étiquetée, qui a, dirons-nous, des booléens bien élevés.

Notez également que cela ne se généralise pas aux opérations au niveau du bit, où vous le souhaitez 0x1234 XNOR 0x5678 == 0xFFFFBBB3(en supposant 32 bits). Pour cela, vous devez construire à partir d'autres opérations, comme ~(A^B). (Remarque: ~non !.)

Keith Thompson
la source
6
En C, l' !opérateur peut être utilisé pour convertir int« est à « bien comportés » booléens: !a==!b.
ivan_pozdeev
2
@ivan_pozdeev And !!(c'est deux opérateurs logiques "non") normalise toute valeur scalaire à 0ou 1.
Keith Thompson
5

XOR = A ou B, mais pas A & B ou ni l'un ni l'autre (ne peut être égal [! =])
XNOR est donc l'oppoiste exact, et peut être facilement représenté par == ou ===.

Cependant, les cas non booléens présentent des problèmes, comme dans cet exemple:

a = 5
b = 1

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

à la place, utilisez ceci:

a = 5
b = 1

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

ou

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

le premier exemple retournera false (5! = 1), mais le second retournera true (les valeurs de a [valeur?] et b [valeur?] renvoient le même booléen, true (valeur = pas 0 / il y a une valeur )

l'exemple alt est juste la porte inversée (a || b) &&! (a && b) (XOR)

Braden Best
la source
3

Non, vous devez utiliser !(A^B)

Bien que je suppose que vous pourriez utiliser la surcharge d'opérateurs pour créer votre propre XNOR.

Griffon
la source
1
Ceci est au niveau du bit, pas logique
sll
Je pense que l'affiche le sait car il l'a inclus dans sa question.
Griffin
4
@sllev tu m'as presque eu, j'ai dû le vérifier. En C # ^ est logique s'il est opéré sur booléen. S'il est utilisé sur des types intégraux, il est au niveau du bit. Veuillez consulter msdn.microsoft.com/en-us/library/zkacc7k1.aspx
trailmax
@trailmax: des trucs sympas, merci d'avoir souligné ça! Vraiment le diable est en détail!
sll
-6

Vous pouvez utiliser l' ===opérateur pour XNOR. Il vous suffit de convertir aet bde booléen.

if (!!a === !!b) {...}
user7797323
la source
1
seul C # n'a pas d' ===opérateur
trailmax
aucune de cette réponse n'est correcte, ===l'opérateur non coercitif est javascript et le double !!avant une valeur dans une évaluation n'est pas non plus valide en c #
Remi
comme déjà indiqué, c # n'a pas d'opérateur de signe triple égal.
cramopy
=== n'est pas un operatr en C # ... (===) est utilisé est JavaScript.
Darkcoder