Есть ли в C # оператор XNOR (логический двунаправленный)? - PullRequest
120 голосов
/ 14 августа 2011

Я новичок в C # и не могу найти оператора XNOR для предоставления этой таблицы истинности:

a  b    a XNOR b
----------------
T  T       T
T  F       F
F  T       F
F  F       T

Есть ли конкретный оператор для этого? Или мне нужно использовать! (A ^ B)?

Ответы [ 4 ]

224 голосов
/ 14 августа 2011

XNOR - это просто равенство по логическим значениям;use A == B.

Это легко упустить, поскольку равенство обычно не применяется к логическим значениям.И есть языки, где это не обязательно будет работать.Например, в C любое ненулевое скалярное значение считается истинным, поэтому два «истинных» значения могут быть неравными.Но вопрос был помечен , который имеет, скажем так, булевы с хорошим поведением.

Обратите также внимание, что это не обобщает битовые операции, где вы хотите 0x1234 XNOR 0x5678 == 0xFFFFBBB3 (при условии 32 бит).Для этого вам нужно создать из других операций, таких как ~(A^B).(Примечание: ~, а не !.)

4 голосов
/ 29 января 2012

XOR = A или B, но не A & B или ни то, ни другое (не может быть равным [! =])
Таким образом, XNOR является точной противоположностью, и его можно легко представить с помощью == или ===.

Однако, не булевские случаи представляют проблемы, как в этом примере:

a = 5
b = 1

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

, вместо этого используйте это:

a = 5
b = 1

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

или

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

первый пример вернет false (5! = 1), а второй вернет true (значения a [value?] И b [value?] Возвращают то же логическое значение, true (value = not 0 / there)является значением)

альтернативный пример - просто перевернутый (a || b) &&! (a && b) (XOR) строб

2 голосов
/ 14 августа 2011

Нет, вам нужно использовать !(A^B)

Хотя я полагаю, вы могли бы использовать перегрузку операторов для создания собственного XNOR.

0 голосов
/ 31 марта 2017

Вы можете использовать оператор === для XNOR.Просто вам нужно конвертировать a и b в bool.

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