Как компактно записать "Исключающее ИЛИ"?

Как реализовать исключающее или? В большинстве языков эта конструкция не реализована на уровне языка. Поэтому приходится писать неочевидные конструкции вида:

!a && b || b && !a

Это можно завернуть в функцию, разумеется:

xor(a, b)

Но нельзя исключать человеческий фактор, который часто может приводить к конструкциям вида:

!variable.very_long_name_field_1.very_long_subname_field && variable.very_long_name_field_1.very_long_subname_field_a || variable.very_long_name_field_1.very_long_subname_field && !variable.very_long_name_field_1.very_long_subname_field_a

В качестве ответа приведите компактный пример вычисления XOR (исключающего или).


Ответы (4 шт):

Автор решения: zed

Для булевых значений, в go ответ будет таким:

if boolA != boolB {

}

Результат сравнения равен true только если один из операндов true, а второй false, т.е. не равны друг другу. Именно так и работает xor.

https://stackoverflow.com/a/27211124

→ Ссылка
Автор решения: MarianD
bool(a) ^ bool(b)

Когда a и/или b уже типа bool, не надо к нему — конечно — применить функцию bool(), но нужно не забыть использовать скобки, например

(5 > 4) ^ (1 > 7)     # True
→ Ссылка
Автор решения: Taras Yavorskyy

А что, никто не заметил ошибку у автора? В его ответе:

!a && b || b && !a

Первая часть: !a && b то же самое что и вторая часть: b && !a Я заметил, но подумал что я чего то не понимаю и напечатал как есть в Kotlin, но IntelliJ Idea сразу предупредила что я написал фигню какую то, но я упорствовал и запустил код как есть и получил ответ который совсем не есть XOR

Надо исправить:

!a && b || a && !b

тогда будет XOR

→ Ссылка