¿Hay un operador XNOR (lógico bicondicional) en C #?

136

Soy nuevo en C # y no pude encontrar el operador XNOR para proporcionar esta tabla de verdad:

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

¿Hay un operador específico para esto? ¿O necesito usar! (A ^ B)?

trailmax
fuente
94
Este operador es más conocido como ==operandos booleanos ...
Magnus Hoff
@Magnus Hoff: bonito, muy buen punto!
todo el
24
Creo que la frase "no puedo ver la madera de los árboles" es muy apropiada aquí. Votar porque todos hemos estado aquí una o dos veces;)
gasta el
1
Tal vez el OP iz l33t k! D que quiere escribir un increíble shellcodez y necesita de alguna manera ocultar la operación de comparación. Es una posibilidad ...
Kerrek SB
44
lo siento, Kerrek, no soy de esa multitud. Y el gastador está bastante aquí -)
trailmax

Respuestas:

250

XNOR es simplemente igualdad en booleanos; uso A == B.

Esto es algo fácil de perder, ya que la igualdad no se aplica comúnmente a los booleanos. Y hay idiomas donde no necesariamente funcionará. Por ejemplo, en C, cualquier valor escalar distinto de cero se trata como verdadero, por lo que dos valores "verdaderos" pueden ser desiguales. Pero la pregunta fue etiquetada, que tiene, digamos, booleanos de buen comportamiento.

Tenga en cuenta también que esto no se generaliza a las operaciones bit a bit, donde lo desee 0x1234 XNOR 0x5678 == 0xFFFFBBB3(suponiendo 32 bits). Para eso, necesitas construir desde otras operaciones, como ~(A^B). (Nota: ~no !)

Keith Thompson
fuente
66
En C, !el operador puede ser usado para convertir int'S para booleanos 'buen comportamiento': !a==!b.
ivan_pozdeev
2
@ivan_pozdeev Y !!(que es dos "no" operadores lógicos) normaliza cualquier valor escalar a 0o 1.
Keith Thompson, el
5

XOR = A o B, pero no A y B o ninguno (No puede ser igual [! =])
XNOR es, por lo tanto, el opuesto exacto, y se puede representar fácilmente por == o ===.

Sin embargo, los casos no booleanos presentan problemas, como en este ejemplo:

a = 5
b = 1

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

en su lugar, use esto:

a = 5
b = 1

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

o

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

el primer ejemplo devolverá falso (5! = 1), pero el segundo devolverá verdadero (los valores de a [valor?] yb [valor?] devuelven el mismo valor booleano, verdadero (valor = no 0 / hay un valor )

el ejemplo alternativo es solo la puerta invertida (a || b) &&! (a && b) (XOR)

Braden Best
fuente
3

No, necesitas usar !(A^B)

Aunque supongo que podría usar la sobrecarga del operador para hacer su propio XNOR.

Grifo
fuente
1
Esto es bit a bit, no es lógico
todavía
Creo que el cartel lo sabe, ya que lo ha incluido en su pregunta.
Griffin
44
@sllev casi me tienes, tuve que verificarlo dos veces. En C # ^ es lógico si se opera en booleano. Si se opera en tipos integrales, es bit a bit. Consulte msdn.microsoft.com/en-us/library/zkacc7k1.aspx
trailmax el
@trailmax: cosas geniales, ¡gracias por señalar esto! Realmente el diablo está en detalle!
todo el
-6

Puede usar el ===operador para XNOR. Solo necesitas convertir ay bbool.

if (!!a === !!b) {...}
usuario7797323
fuente
1
solo C # no tiene ===operador
trailmax
ninguna de estas respuestas es correcta, ===el operador no coercitivo es javascript y el doble !!antes de un valor en una evaluación tampoco es válido en c #
Remi
como ya se dijo, c # no tiene operador de triple signo igual.
cramopy
=== no es un operatr en C # ... (===) se usa es JavaScript.
Darkcoder