#java #logical-operators
#java #логические операторы
Вопрос:
вот проблема, которая решается
«Вам даны три целых числа: a, b и c. Гарантируется, что два из этих целых чисел равны друг другу. Каково значение третьего целого числа? »
вот код
int extraNumber(int a, int b, int c) {
return a^b^c;
}
Я понимаю, что курсор » ^ » означает XOR, что означает «это ИЛИ то, но не оба» в простых терминах, но я не понимаю, как этот код определяет, какой int отличается от других, или, возможно, я неправильно понимаю XOR?
Комментарии:
1.
X ^ X
есть0
.0 ^ Y
естьY
. ПоэтомуX ^ X ^ Y
всегдаY
. То же самое верно и дляX ^ Y ^ X
andY ^ X ^ X
.
Ответ №1:
Посмотрите на это на уровне битов:
- Значение
x
, сопоставленное с самим собой, всегда приведет к 0 (проверьте:1^1=0
и0^0=0
). - Значение
y
, равное 0, всегда будет приводить к одному и тому же значениюy
(проверьте:1^0=1
и0^0=0
).
Поскольку оно справедливо для отдельных битов и int
составляет всего 32 бита, те же правила справедливы и для полных int
значений.
Поэтому методу не нужно выяснять, «какие значения отличаются», потому что значение, сопоставленное с самим собой с cancel out равным 0, и сопоставление «оставшегося» значения с 0 просто вернет то же значение.
Ответ №2:
Ответ Иоахима верен, и чтобы добавить немного больше деталей к примеру, предположим, что вы передаете три аргумента (2, 3, 2) своему методу, формат битового уровня обычно ...16 8 4 2 1
начинается с правой стороны, согласно таблице истинности для XOR,
https://en.wikipedia.org/wiki/XOR_gate
private int extraNumber(int a, int b, int c) {
// 8421 -> this is bit level,
// let's compare a^b
// 0010 = 2 (a value)
// 0011 = 3 (b value, sum of 2nd 1st bits)
// 0001 = 1 (after XOR with a^b)
// 0010 = 2 (c value)
// 0011 = 3 (the final output)
return a^b^c;
}
Ответ №3:
вы также можете проверить промежуточные результаты, разбив код a ^b ^c на два оператора.
например
int a = 0b1010_1010;
int b = 0b1010_1010; //same value as b
int c = 0b1111_0000; //the remaining item
//CASE 1 (xor the different values first)
int d = a^c; // results in 0b0101_1010
int e = d^b; // results in 0b1111_0000 (the answer)
//CASE 2 (xor the same values first)
int d = a^b; // results in 0b0000_0000
int e = d^c; // results in 0b1111_0000 (the answer)