Как Xor определяет, какой int отличается?

#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 and Y ^ 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)