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

136

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

аба XNOR б
----------------
ТТТ
ПТФ
ФТФ
FFT

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

trailmax
источник
94
Этот оператор более известен как ==булевы операнды ...
Магнус Хофф
@Magnus Hoff: хороший, очень хороший момент!
SLL
24
Я думаю, что фраза «не вижу дерева за деревьями» здесь очень уместна. Голосование, потому что мы все были здесь один или два раза;)
спонсор
1
Может быть, это ОП, который хочет написать потрясающий шеллкодез и должен каким-то образом скрыть операцию сравнения. Это возможно ...
Kerrek SB
4
извини, Керрек, я не из этой толпы. И спонсор совершенно прямо здесь -)
trailmax

Ответы:

250

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

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

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

Кит Томпсон
источник
6
В C, !оператор может быть использовано для преобразования int«с до„хорошо себя“булева: !a==!b.
ivan_pozdeev
2
@ivan_pozdeev И !!(это два логических оператора «не») нормализует любое скалярное значение для 0или 1.
Кит Томпсон
5

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 (значение = не 0 / есть значение) )

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

Брэден Бест
источник
3

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

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

Грифон
источник
1
Это побитовое, а не логичное
скл
Я думаю, что плакат знает это, поскольку он включил это в свой вопрос.
Гриффин
4
@ ты меня почти достал, мне пришлось перепроверить. В C # ^ логично, если оперируется булево. При работе с целочисленными типами он является побитовым. Пожалуйста, смотрите msdn.microsoft.com/en-us/library/zkacc7k1.aspx
trailmax
@trailmax: классные вещи, спасибо за указание на это! Действительно дьявол в деталях!
SLL
-6

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

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