Есть ли в С# оператор XNOR (логический биусловный)?

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

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

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


person trailmax    schedule 14.08.2011    source источник
comment
Этот оператор более известен как == для логических операндов...   -  person Magnus Hoff    schedule 14.08.2011
comment
@Magnus Hoff: хороший очень хороший момент!   -  person sll    schedule 14.08.2011
comment
Я думаю, что фраза «за деревьями не видит леса» здесь очень уместна. Голосую за, потому что мы все были здесь один или два раза;)   -  person spender    schedule 14.08.2011
comment
Может быть, OP iz l33t k!d, который хочет написать классный шеллкод и ему нужно как-то скрыть операцию сравнения. Это возможность...   -  person Kerrek SB    schedule 14.08.2011
comment
извини, Керрек, я не из этой толпы. И транжира здесь совершенно права -)   -  person trailmax    schedule 14.08.2011
comment
Просто дважды попал в одну и ту же дыру. Метафора @spender уместна   -  person enzi    schedule 05.03.2019


Ответы (4)


XNOR — это просто равенство логических значений; используйте 1_.

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

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

person Keith Thompson    schedule 14.08.2011
comment
В C оператор ! можно использовать для преобразования int в корректные логические значения: !a==!b. - person ivan_pozdeev; 11.09.2014
comment
@ivan_pozdeev И !! (это два логических оператора not) нормализует любое скалярное значение до 0 или 1. - person Keith Thompson; 04.12.2019

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

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

a = 5
b = 1

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

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

a = 5
b = 1

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

or

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

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

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

person Braden Best    schedule 28.01.2012

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

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

person Griffin    schedule 14.08.2011
comment
Это побитовое, а не логическое - person sll; 14.08.2011
comment
Я думаю, что плакат знает это, поскольку он включил это в свой вопрос. - person Griffin; 14.08.2011
comment
@sllev, ты почти меня понял, мне пришлось перепроверить. В C# ^ логичен, если работает с логическим значением. Если оперировать с целочисленными типами, то побитово. См. msdn.microsoft.com/en-us/library/zkacc7k1.aspx< /а> - person trailmax; 14.08.2011
comment
@trailmax: классная вещь, спасибо, что указали на это! На самом деле дьявол кроется в деталях! - person sll; 14.08.2011

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

if (!!a === !!b) {...}
person user7797323    schedule 31.03.2017
comment
только в С# нет оператора === - person trailmax; 31.03.2017
comment
ни один из этих ответов не является правильным, === непринудительный оператор - это javascript, а двойной !! перед значением в оценке также недействителен в С# - person Remi; 26.10.2017
comment
как уже говорилось, в С# нет оператора тройного знака равенства. - person cramopy; 26.10.2017
comment
=== не является оператором в C#...(===) используется в JavaScript. - person Darkcoder; 12.02.2020