Как компактно записать "Исключающее ИЛИ"?
Как реализовать исключающее или? В большинстве языков эта конструкция не реализована на уровне языка. Поэтому приходится писать неочевидные конструкции вида:
!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 шт):
Для булевых значений, в go ответ будет таким:
if boolA != boolB {
}
Результат сравнения равен true только если один из операндов true, а второй false, т.е. не равны друг другу. Именно так и работает xor.
bool(a) ^ bool(b)
Когда a и/или b уже типа bool, не надо к нему — конечно — применить функцию bool(), но нужно не забыть использовать скобки, например
(5 > 4) ^ (1 > 7) # True
А что, никто не заметил ошибку у автора? В его ответе:
!a && b || b && !a
Первая часть: !a && b то же самое что и вторая часть: b && !a
Я заметил, но подумал что я чего то не понимаю и напечатал как есть в Kotlin, но IntelliJ Idea сразу предупредила что я написал фигню какую то, но я упорствовал и запустил код как есть и получил ответ который совсем не есть XOR
Надо исправить:
!a && b || a && !b
тогда будет XOR