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


136

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

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

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


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

1
только C # не имеет ===оператора
trailmax

ни один из этих ответов не является правильным, ===не принудительный оператор является javascript, и двойное число !!перед значением в оценке также недопустимо в c #
Remi

как уже говорилось, c # не имеет тройного оператора равенства.
cramopy

=== это не оператор в C # ... (===) используется JavaScript.
Darkcoder
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.