Мне нужно сделать условное xor между 3 значениями, т.е. мне нужно, чтобы одно из трех значений было истинным, но не более одного и ни одного .
Я думал, что могу использовать для этого оператор xor ^, но он работает не так, как ожидалось.
Я ожидал, что это вернет false, но это не так. (true ^ true ^ true)
все остальные комбинации, похоже, работают так, как я ожидал.
При просмотре документации по оператору xor они говорят только о сравнении двух значений, и я не могу найти ничего, чтобы сделать это для 3 или больше значений в Интернете.
Может ли кто-нибудь пролить свет или предложить простой способ сделать это?
Поскольку я не могу получить достаточно Linq, как насчет:
new[] { a, b, c }.Count(v => v) == 1
XOR - бинарный оператор, он может использоваться только для 2 значений одновременно. Итак, когда вы делаете (true XOR true XOR true)
, это на самом деле делает ((true XOR true) XOR true)
...
Внутренний (true XOR true)
разрешается к false
, потому что они одинаковы. После того, как это решено, остаток - (false XOR true)
, который решает к true
.
Похоже, вы пытаетесь быть умным или сверхэффективным в отношении соответствия вашим условиям. Вероятно, мне понадобится несколько минут, чтобы разобраться, а затем написать таблицу истинности или тест, чтобы убедиться, что он правильно обрабатывает все возможные комбинации.
Намного проще посчитать, сколько их true
и сделать if (countTrues == 1)
. Причина этого в том, что он не имеет значительных накладных расходов, и на самом деле он читабелен и понятен по сравнению с решением, использующим только сдвоенный бит (здесь есть пара других ответов, которые демонстрируют это).
Используя XOR, if (false^false^false)
должен вернуть false
. Это работает, как XOR предполагается работать. Exclusive Or возвращает true, если один и только один из элементов имеет значение true. Если все они ложны, он вернет ложь.
Если вы хотите сделать это с 3 значениями, скажем, a, b и c, выражение должно быть примерно таким: (a или b или c) и ~ (a и b) и ~ (a и c) и ~ (б и в)
вот более правильный формат: (avbvc) * ~ (a * b) * ~ (a * c) * ~ (b * c)