xor с 3 значениями

Мне нужно сделать условное xor между 3 значениями, т.е. мне нужно, чтобы одно из трех значений было истинным, но не более одного и ни одного .

Я думал, что могу использовать для этого оператор xor ^, но он работает не так, как ожидалось.

Я ожидал, что это вернет false, но это не так. (true ^ true ^ true)

все остальные комбинации, похоже, работают так, как я ожидал.

При просмотре документации по оператору xor они говорят только о сравнении двух значений, и я не могу найти ничего, чтобы сделать это для 3 или больше значений в Интернете.

Может ли кто-нибудь пролить свет или предложить простой способ сделать это?

26
задан sianabanana 3 June 2011 в 14:19
поделиться

3 ответа

Поскольку я не могу получить достаточно Linq, как насчет:

new[] { a, b, c }.Count(v => v) == 1

11
ответ дан 28 November 2019 в 06:50
поделиться

XOR - бинарный оператор, он может использоваться только для 2 значений одновременно. Итак, когда вы делаете (true XOR true XOR true), это на самом деле делает ((true XOR true) XOR true) ...

Внутренний (true XOR true) разрешается к false, потому что они одинаковы. После того, как это решено, остаток - (false XOR true), который решает к true.

Похоже, вы пытаетесь быть умным или сверхэффективным в отношении соответствия вашим условиям. Вероятно, мне понадобится несколько минут, чтобы разобраться, а затем написать таблицу истинности или тест, чтобы убедиться, что он правильно обрабатывает все возможные комбинации.

Намного проще посчитать, сколько их true и сделать if (countTrues == 1). Причина этого в том, что он не имеет значительных накладных расходов, и на самом деле он читабелен и понятен по сравнению с решением, использующим только сдвоенный бит (здесь есть пара других ответов, которые демонстрируют это).

2
ответ дан 28 November 2019 в 06:50
поделиться

Используя 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)

2
ответ дан 28 November 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: