Какая разница между XOR и NOT-EQUAL-TO?

Мой вопрос использует Java в качестве примера, но я думаю, что это относится, вероятно, ко всем.

Есть ли практическое различие между оператором XOR (^ в Java) и оператором не равным (!= в Java) при сравнении логических значений?

Я оценил вещи здесь, но я продолжал задаваться вопросом (кажется странным, две вещи равными)... и не нашел ничего в сети. Только одна дискуссия на каком-то форуме, которая быстро закончилась безрезультатно.

Ответ 1

Для булевых значений они означают одно и то же: хотя существует сложный оператор присваивания для XOR:

x ^= y;

Нет эквивалентного оператора присваивания для неравенства.

Что касается того, почему они оба доступны, было бы странно, что XOR не будет доступен только потому, что он работает так же, как и неравенство. Он должен логически быть там, так и есть. Для небулевых типов результат различен, потому что это другой тип результата, но это не значит, что имеет смысл удалить XOR для boolean.

Ответ 2

Как указано в Спецификация языка Java:

Результат if = is false, если оба операнда верны или оба ложны; в противном случае результат будет истинным. Таким образом,!= Ведет себя так же, как ^ (§15.22.2) при применении к булевым операндам.

Кроме того, если вы попытаетесь взглянуть на байт-код простого фрагмента:

void test(boolean b1, boolean b2) {
    boolean res1 = b1^b2;
    boolean res2 = b1!=b2;
}

вы получаете:

test(ZZ)V
   L0
    LINENUMBER 45 L0
    ILOAD 1
    ILOAD 2
    IXOR
    ISTORE 3
   L1
    LINENUMBER 46 L1
    ILOAD 1
    ILOAD 2
    IXOR
    ISTORE 4
   L2
    LINENUMBER 47 L2
    RETURN
   L3

Это гарантирует, что в дополнение к той же семантике нет никакой реальной практической разницы в реализации. (вы также можете видеть, что внутренние ints используются для хранения логических значений)

Ответ 3

Да, вы можете использовать XOR для проверки логических значений для (in) равенства, хотя код менее интуитивно понятен: if (x ^ y) versus if (x != y).

Ответ 4

С булевыми значениями не должно быть разницы. Вы должны выбрать то, что более подходит для вашего ощущения.

Пример:

bool oldChoice = ...;
bool newChoice = ...;
if (oldChoice != newChoice)
    ...

Здесь XOR даст тот же результат, но не будет отражать действительное намерение кода.

Ответ 5

В этом случае они должны быть по существу одинаковыми.

Ответ 6

Там большая разница, XOR работает на уровне бит, сохраняя различия как одни, поэтому 0b0011 xor 0b1101 = > 0b1110

С уважением, // т