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


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


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)


3

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

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


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.