Existe um operador XNOR (bicondicional lógico) em C #?

136

Eu sou novo em C # e não consegui encontrar o operador XNOR para fornecer esta tabela de verdade:

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

Existe um operador específico para isso? Ou eu preciso usar! (A ^ B)?

trailmax
fonte
94
Este operador é mais comumente conhecido como ==operandos booleanos ...
Magnus Hoff
@Magnus Hoff: bom ponto muito bom!
SLL
24
Eu acho que a frase "não consigo ver a madeira para as árvores" é altamente apropriada aqui. Votação porque todos nós já estivemos aqui uma ou duas vezes;)
spender
1
Talvez o operador que deseja escrever shellcodez incríveis e precise ocultar de alguma forma a operação de comparação. É uma possibilidade ...
Kerrek SB
4
desculpe, Kerrek, eu não sou dessa multidão. E gastador é bastante aqui -)
TRAILMAX

Respostas:

250

XNOR é simplesmente igualdade em booleanos; use A == B.

É uma coisa fácil de perder, já que a igualdade não é comumente aplicada aos booleanos. E há idiomas em que isso não necessariamente funciona. Por exemplo, em C, qualquer valor escalar diferente de zero é tratado como verdadeiro, portanto, dois valores "verdadeiros" podem ser desiguais. Mas a pergunta foi marcada, que tem, digamos, booleanos bem comportados.

Observe também que isso não generaliza para operações bit a bit, onde você deseja 0x1234 XNOR 0x5678 == 0xFFFFBBB3(assumindo 32 bits). Para isso, você precisa criar a partir de outras operações, como ~(A^B). (Nota: ~não !.)

Keith Thompson
fonte
6
Em C, !operador pode ser usada para converter int's para booleanos 'bem comportadas': !a==!b.
ivan_pozdeev
2
@ivan_pozdeev E !!(são dois operadores lógicos "não") normaliza qualquer valor escalar para 0ou 1.
Keith Thompson
5

XOR = A ou B, mas não A & B ou nenhum (Não pode ser igual a [! =])
XNOR é, portanto, o oposto oposto e pode ser facilmente representado por == ou ===.

No entanto, casos não booleanos apresentam problemas, como neste exemplo:

a = 5
b = 1

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

em vez disso, use o seguinte:

a = 5
b = 1

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

ou

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

o primeiro exemplo retornará false (5! = 1), mas o segundo retornará true (os valores de a [value?] eb [value?] retornam o mesmo booleano, true (value = not 0 / existe um valor )

o exemplo alt é apenas o portão invertido (a || b) &&! (a && b) (XOR)

Braden Best
fonte
3

Não, você precisa usar !(A^B)

Embora eu suponha que você possa usar sobrecarga de operador para criar seu próprio XNOR.

Griffin
fonte
1
Esta é bit a bit, e não uma lógica
SLL
Acho que o pôster sabe disso, pois ele o incluiu em sua pergunta.
Griffin
4
@llev você quase me pegou, eu tive que checar. Em C # ^ é lógico se operado em booleano. Se operado em tipos integrais, é bit a bit. Consulte msdn.microsoft.com/en-us/library/zkacc7k1.aspx
trailmax
@trailmax: coisas legais, obrigado por apontar sobre isso! Realmente o diabo está em detalhes!
SLL
-6

Você pode usar o ===operador para o XNOR. Só você precisa converter ae bbool.

if (!!a === !!b) {...}
user7797323
fonte
1
somente C # não tem ===operador
TRAILMAX
nada disso resposta está correta, ===o operador não-coercitiva é javascript ea dupla !!antes de um valor em uma avaliação não é válido no c # quer
Remi
como já mencionado, o c # não possui um operador de sinal de igual triplo.
cramopy
=== não é um operador em C # ... (===) é usado é JavaScript.
Darkcoder