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)?


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 !.)


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)


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.


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) {...}

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.