Як так, що C # не має умовного XOR
оператора?
Приклад:
true xor false = true
true xor true = false
false xor false = false
Як так, що C # не має умовного XOR
оператора?
Приклад:
true xor false = true
true xor true = false
false xor false = false
& | ^
) проти умовних операторів ( && ||
). Але ти маєш рацію (звичайно), є логічний XOR ...
Відповіді:
У C # умовні оператори виконують лише свій вторинний операнд, якщо це необхідно .
Оскільки XOR повинен за визначенням перевіряти обидва значення, умовна версія була б безглуздою.
Приклади :
Логічне І: &
- щоразу тестує обидві сторони.
Логічне АБО: |
- щоразу перевіряйте обидві сторони.
Умовне І: &&
- перевіряє лише другу сторону, якщо перша сторона відповідає дійсності.
Умовне АБО: ||
- протестуйте 2-ю сторону, лише якщо 1-ва сторона хибна.
Питання трохи застаріле, але ...
Ось як повинен працювати цей оператор:
true xor false = true
true xor true = false
false xor true = true
false xor false = false
Ось як працює оператор! = З типами bool:
(true != false) // true
(true != true) // false
(false != true) // true
(false != false) // false
Отже, як ви бачите, неіснуюче ^^
можна замінити існуючим!=
!=
буде працювати.
AND
і OR
але нічого як XOR
. або принаймні ми не усвідомлювали !=
:) @TheEvilGreebo
Існує логічний оператор XOR: ^
Документація: Оператори C # та ^ Оператор
^
при використанні з логічними операндами є логічним оператором. "для операндів bool оператор ^ обчислює той самий результат, що і оператор нерівності! =". Ви також можете розрядно-xor цілі операнди за допомогою ^
. C # - це не C.
Як уточнення, оператор ^ працює як з інтегральними типами, так і з bool.
Див . ^ Оператор MSDN (посилання на C #) :
Двійкові ^ оператори визначені для інтегральних типів та bool. Для інтегральних типів ^ обчислює побітове виключення-АБО своїх операндів. Для bool-операндів ^ обчислює логічний ексклюзив або його операнди; тобто результат є істинним тоді і лише тоді, коли точно відповідає одному з його операндів.
Можливо, документація змінилася з 2011 року, коли було задано це питання.
^
та передує цій відповіді на п’ять років. Сумніваюся, що-небудь змінилося.
На запитання Марка Л , ось правильна версія:
Func<bool, bool, bool> XOR = (X,Y) => ((!X) && Y) || (X && (!Y));
Ось таблиця правди:
X | Y | Result
==============
0 | 0 | 0
1 | 0 | 1
0 | 1 | 1
1 | 1 | 0
Довідково: Ексклюзивно АБО
О так, це так.
bool b1 = true;
bool b2 = false;
bool XOR = b1 ^ b2;
i1
просто, як і байт). Це 100% визначена та безпечна керована поведінка. CLR не є грубим .; Вперше я побачив таку поведінку під час використання Microsoft Pex.
Умовний xor не існує, але ви можете використовувати логічний, оскільки xor визначено для логічних типів, а всі умовні порівняння оцінюються як логічні.
Тож ви можете сказати щось на зразок:
if ( (a == b) ^ (c == d))
{
}
1
. Це маловідомий факт. Ви можете опинитися в ситуації, коли xor двох неправдивих булевих символів все ще не хибний! Сказане в цьому конкретному коді оператор xor застосовується лише до значень у [0,1], тому мій коментар не застосовується (повністю).
&
також вразливий.
&&
так, ніби це було, &
що є неправильною компіляцією.
Хоча існує логічний оператор xor ^
, умовного оператора xor не існує . Ви можете досягти умовного xor двох значень A і B, використовуючи наступне:
A ? (!B) : B
Парени не потрібні, але я додав їх для наочності.
Як вказує The Evil Greebo, це обчислює обидва вирази, але xor не може бути короткозамкненим, як і та або .
0101 ^ 0011
має значення 0110
.
Не існує такого поняття, як умовне (коротке замикання) XOR. Умовні оператори мають значення лише тоді, коли є спосіб остаточно визначити кінцевий результат, розглядаючи лише перший аргумент. XOR (і доповнення) завжди вимагає двох аргументів, тому після першого аргументу немає можливості короткого замикання.
Якщо ви знаєте A = true, то (A XOR B) =! B.
Якщо ви знаєте A = false, то (A XOR B) = B.
В обох випадках, якщо ви знаєте A, але не B, то знаєте недостатньо, щоб знати (A XOR B). Ви завжди повинні вивчити значення як A, так і B, щоб обчислити відповідь. Буквально не існує жодного випадку використання, коли ви коли-небудь можете вирішити XOR без обох значень.
Майте на увазі, XOR за визначенням має чотири випадки:
false xor true = true
true xor false = true
true xor true = false
false xor false = false
Знову ж таки, сподіваємось, з вищесказаного очевидно, що знання першого значення ніколи не буває достатнім для отримання відповіді, не знаючи також другого значення. Однак у своєму питанні ви пропустили перший випадок. Якщо ви натомість хотіли
false op true = false (or DontCare)
true op false = true
true op true = false
false op false = false
тоді ви дійсно можете отримати це за допомогою короткого замикання умовної операції:
A && !B
Але це не XOR.
На це запитання відповіли афективно, але я зіткнувся з іншою ситуацією. Це правда, що немає потреби в умовному XOR. Також вірно, що можна використовувати оператор ^. Однак, якщо вам потрібно протестувати лише статус "true || false" операндів, тоді ^ може призвести до проблем. Наприклад:
void Turn(int left, int right)
{
if (left ^ right)
{
//success... turn the car left or right...
}
else
{
//error... no turn or both left AND right are set...
}
}
У цьому прикладі, якщо зліва встановлено значення 10 (0xa), а праворуч встановлено значення 5 (0x5), вводиться гілка "успіху". У цьому (спрощеному, якщо дурному) прикладі це призведе до помилки, оскільки не слід одночасно повертати вліво та вправо. Що я довідався від запитувача, це не те, що він насправді хотів умовного, а простий спосіб виконати істинні / хибні значення для значень, переданих xor.
Макрос може зробити фокус:
#define my_xor(a, b) ( ((a)?1:0) ^ ((b)?1:0) )
Не соромтеся ляпати мене, якщо я не в курсі: o)
Відповідь jimreed я прочитав нижче після того, як опублікував це (поганий Yapdog!), А його насправді простіше. Це спрацювало б, і я абсолютно не уявляю, чому його відповідь була відхилена ...
if
вимагає булевого виразу, він навіть не компілюється з int.
!=
працює заміна?