В Java XOR с тремя входами true возвращает true.Зачем? - PullRequest
12 голосов
/ 03 июня 2011

Следующий код

System.out.println("1 0 0: " + (true ^ false ^ false));
System.out.println("1 0 1: " + (true ^ false ^ true));
System.out.println("1 1 0: " + (true ^ true ^ false));
System.out.println("1 1 1: " + (true ^ true ^ true));
System.out.println("0 0 0: " + (false ^ false ^ false));
System.out.println("0 0 1: " + (false ^ false ^ true));
System.out.println("0 1 0: " + (false ^ true ^ false));
System.out.println("0 1 1: " + (false ^ true ^ true));

выводит:

1 0 0: true
1 0 1: false
1 1 0: false
1 1 1: true
0 0 0: false
0 0 1: true
0 1 0: true
0 1 1: false

Почему XOR возвращает true, когда все три входа true?

Если этодопустимая логика, как я могу реализовать логику, которая возвращает true только , если один из элементов ввода равен true (независимо от того, сколько входов я предоставляю)?

Ответы [ 7 ]

17 голосов
/ 27 января 2014

Если вы хотите получить истинный результат, если один и только один вход имеет значение true, вы можете использовать:

(a ^ b ^ c ) ^ ( a && b && c )

Результат теста:

true true true = false
true true false = false
true false true = false
true false false = true
false true true = false
false true false = true
false false true = true
false false false = false
11 голосов
/ 03 июня 2011

Потому что true xor true = false, а false xor true равно true.xor является ассоциативным, поэтому сгруппируйте значения любым удобным вам способом!

Чтобы решить, что только одно из них является истинным, вы можете сложить значения вместе как целые числа и посмотреть, равен ли ответ 1.

Я отвечаю на этот вопрос как на общий вопрос программирования, это действительно не относится к Java.

6 голосов
/ 03 июня 2011

Подумайте, как компилятор оценивает это:

(true ^ true) ^ true

После первого слагаемого true ^ true, то есть false, было оценено:

(false) ^ true ==> true
4 голосов
/ 02 февраля 2017

Вот способ Java 8, чтобы определить, является ли точно один логический тип истинным:

Stream.of(b1, b2, b3, ...)
        .filter(b -> b)
        .count() == 1;
3 голосов
/ 03 июня 2011

true ^ true ^ true можно записать (для понимания) как ( true ^ true ) ^ true, что true.

Если A, B, C являются входами, для логики, которую вы ищете, вам нужно что-то вроде этого

(A & !B & !C) | (!A & B & !C) | (!A & !B & C)
2 голосов
/ 03 июня 2011

'^' - это двоичный логический оператор, а не n-арный оператор.

0 голосов
/ 12 февраля 2016

Я не знаю, обнаружен ли он и выделен ли, но я заметил одну вещь: если мы добавим все значения вместе (независимо от того, сколько их там) и посмотрим, что осталось после деления на 2, мы можем заметить, что результат равен false если 0 слева и true если 1 слева.

Пример:

1 ^ 0 ^ 1 ^ 1 = 1 и (1+0+1+1)%2 = 1

Они одинаковы.Пожалуйста, исправьте или направьте меня, кто имеет представление об этом деле.

...