Esiste un operatore XNOR (logico bicondizionale) in C #?


136

Sono nuovo in C # e non sono riuscito a trovare l' operatore XNOR per fornire questa tabella di verità:

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

Esiste un operatore specifico per questo? O devo usare! (A ^ B)?


94
Questo operatore è più comunemente noto come ==operandi booleani ...
Magnus Hoff,

@Magnus Hoff: bel punto molto bello!
sabato

24
Penso che la frase "non riesco a vedere il bosco per gli alberi" sia molto appropriata qui. Voto perché siamo stati tutti qui una o due volte;)
spender

1
Forse l'OP iz l33t k! D che vuole scrivere un fantastico shellcodez e deve in qualche modo nascondere l'operazione di confronto. È una possibilità ...
Kerrek SB

4
scusa Kerrek, non vengo da quella folla. E spender è proprio qui -)
trailmax

Risposte:


250

XNOR è semplicemente uguaglianza con i booleani; usare A == B.

Questa è una cosa facile da perdere, poiché l'uguaglianza non è comunemente applicata ai booleani. E ci sono lingue in cui non funzionerà necessariamente. Ad esempio, in C, qualsiasi valore scalare diverso da zero viene trattato come vero, quindi due valori "veri" possono essere disuguali. Ma la domanda è stata taggata, che ha, diciamo, booleani ben educati.

Si noti inoltre che ciò non generalizza alle operazioni bit a bit, dove si desidera 0x1234 XNOR 0x5678 == 0xFFFFBBB3(presupponendo 32 bit). Per questo, è necessario costruire da altre operazioni, come ~(A^B). (Nota: ~no !.)


6
In C, !operatore può essere utilizzato per convertire int's per booleani 'ben educati': !a==!b.
ivan_pozdeev,

2
@ivan_pozdeev E !!(ovvero due operatori "non" logici) normalizza qualsiasi valore scalare a 0o 1.
Keith Thompson il

5

XOR = A o B, ma non A & B o nessuno dei due (non può essere uguale [! =])
XNOR è quindi l'esatto oppoiste e può essere facilmente rappresentato da == o ===.

Tuttavia, i casi non booleani presentano problemi, come in questo esempio:

a = 5
b = 1

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

invece usa questo:

a = 5
b = 1

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

o

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

il primo esempio restituirà false (5! = 1), ma il secondo restituirà true (a [valore?] e b [valore?] i valori restituiscono lo stesso valore booleano, vero (valore = non 0 / c'è un valore )

l'esempio alt è solo la porta invertita (a || b) &&! (a && b) (XOR)


3

No, devi usare !(A^B)

Anche se suppongo che potresti usare il sovraccarico dell'operatore per creare il tuo XNOR.


1
Questo è bit per bit, non logico
sll

Penso che il poster lo sappia poiché lo ha incluso nella sua domanda.
Griffin,

4
@sllev mi hai quasi preso, ho dovuto ricontrollarlo. In C # ^ è logico se operato su booleano. Se utilizzato su tipi integrali, è bit a bit. Si prega di consultare msdn.microsoft.com/en-us/library/zkacc7k1.aspx
Trailmax

@trailmax: cose interessanti, grazie per averci indicato! Il diavolo è nei dettagli!
sabato

-6

È possibile utilizzare l' ===operatore per XNOR. Hai solo bisogno di convertire ae bbool.

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

1
solo C # non ha un ===operatore
trailmax

nessuna di queste risposte è corretta, ===l'operatore non coercitivo è javascript e il doppio !!prima che un valore in una valutazione non sia valido neanche in c #
Remi,

come già detto, c # non ha un operatore a triplo segno uguale.
Cramopy,

=== non è un operatr in C # ... (===) viene utilizzato è JavaScript.
Darkcoder,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.