Чи є в C # оператор XNOR (логічний двосурядний)?


136

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

аба XNOR b
----------------
TTT
TFF
FTF
FFT

Чи є для цього конкретний оператор? Або мені потрібно використовувати! (A ^ B)?


94
Цей оператор більш відомий як ==булеві операнди ...
Магнус Хофф

@Magnus Hoff: приємний дуже приємний момент!
sll

24
Я думаю, що фраза "не бачу деревини для дерев" тут дуже доречна. Голосування, тому що ми всі були тут один або два рази;)
провели

1
Можливо, OP iz l33t k! D, хто хоче написати дивовижний shellcodez і йому потрібно якось приховати операцію порівняння. Це можливість ...
Kerrek SB

4
вибачте, Керрек, я не з того натовпу. І витрачається цілком прямо тут -)
trailmax

Відповіді:


250

XNOR - це просто рівність булевих; використання A == B.

Це легко пропустити, оскільки рівність зазвичай не застосовується до булів. І є мови, де це не обов'язково працює. Наприклад, у С будь-яке ненульове скалярне значення трактується як істинне, тому два "справжні" значення можуть бути нерівними. Але питання було позначене тегами, що має, скажемо так, добре сприйняті буліни.

Зауважте також, що це не узагальнюється для бітових операцій там, де ви хочете 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)){
...
}

перший приклад поверне помилковий (5! = 1), але другий поверне значення true (значення [value?] і b [value?] повернуть те саме булеве, true (значення = не 0 / є значення )

приклад alt - це просто зворотний (a || b) &&! (a&& b) (XOR) ворота


3

Ні, Вам потрібно скористатися !(A^B)

Хоча я вважаю, що ви можете використовувати перевантаження оператора, щоб зробити свій власний XNOR.


1
Це
побіжно

Я думаю, що плакат знає, що він включив це до свого питання.
Гриффін

4
@sllev ти мене майже завів, мені довелося двічі перевірити це. У C # ^ логічно, якщо він керується булевим. Якщо вони експлуатуються на цілісних типах, це розрядно. Будь ласка, дивіться msdn.microsoft.com/en-us/library/zkacc7k1.aspx
trailmax

@trailmax: класні речі, дякую за вказівку на це! Дійсно чорт у деталях!
sll

-6

Ви можете використовувати ===оператор для XNOR. Просто вам потрібно конвертувати aі bbool.

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

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

жоден з цих відповідей не є правильним, ===непримусовий оператор - це javascript, а подвійне !!перед значенням в оцінці недійсне в c #
Ремі

як уже було сказано, c # не має потрійного знака рівності Оператор.
крамона

=== не є оператором на C # ... (===) використовується JavaScript.
Darkcoder
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.