Условный XOR? - PullRequest
       32

Условный XOR?

73 голосов
/ 28 июня 2011

Почему в C # нет условного оператора XOR?

Пример:

true  xor false = true
true  xor true  = false
false xor false = false

Ответы [ 11 ]

233 голосов
/ 02 февраля 2013

Вопрос немного устарел, но ...

Вот как должен работать этот оператор:

true xor false = true
true xor true = false
false xor false = false

Вот как! = Оператор работает с типами bool:

(true != false) // true
(true != true) // false
(false != false) // false

Итак, как вы видите, несуществующее ^^ можно заменить существующим !=

107 голосов
/ 28 июня 2011

В C # условные операторы выполняют только свой вторичный операнд , если необходимо .

Поскольку XOR должен по определению проверить оба значения, условная версия будет глупой.

Примеры

  • Логическое И: & - каждый раз проверяет обе стороны.

  • Логическое ИЛИ: | - проверять обе стороны каждый раз.

  • Условное И: && - проверяет 2-ю сторону, только если 1-я сторона истинна.

  • Условное ИЛИ: || - проверять 2-ю сторону только в том случае, если 1-я сторона ложна.

23 голосов
/ 28 июня 2011

Существует логический оператор XOR: ^

Документация: Операторы C # и ^ Оператор

22 голосов
/ 13 июня 2016

Как пояснение, оператор ^ работает как с целочисленными типами, так и с типом bool.

См. Оператор MSDN ^ (справочник по C #) :

Двоичный^ операторы предопределены для целочисленных типов и bool.Для целочисленных типов ^ вычисляет побитовое исключающее ИЛИ его операндов.Для операндов bool ^ вычисляет логический исключающий или его операндов;то есть результат верен тогда и только тогда, когда точно один из его операндов верен.

Возможно, документация изменилась с 2011 года, когда был задан этот вопрос.

11 голосов
/ 29 декабря 2015

По просьбе Марк Л , вот правильная версия:

 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

Ссылка: Эксклюзив ИЛИ

4 голосов
/ 28 июня 2011

Хотя существует логический оператор xor ^, нет условного оператора xor.Вы можете получить условное значение xor для двух значений A и B, используя следующее:

A ? (!B) : B

Паренсы не нужны, но я добавил их для ясности.Greebo, это вычисляет оба выражения, но xor не может быть закорочен, как и и или .

4 голосов
/ 28 июня 2011

Условного xor не существует, но вы можете использовать логический, потому что xor определен для логических значений, а все условные сравнения оцениваются как логические.

Так что вы можете сказать что-то вроде:

if ( (a == b) ^ (c == d))
{

}
4 голосов
/ 28 июня 2011

О да, это так.

bool b1 = true;
bool b2 = false;
bool XOR = b1 ^ b2;
1 голос
/ 28 июня 2011

вы можете использовать:

a = b ^ c;

, как в c / c ++

0 голосов
/ 16 мая 2019

Нет такой вещи как условное (короткое замыкание) 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.

...