В чем разница между XOR и NOT-EQUAL-TO? - PullRequest
26 голосов
/ 14 ноября 2010

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

Есть ли практическая разница между оператором XOR (^ в Java) и NOT-EQUAL-TO (! =в java), когда сравнивал логические значения?

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

Ответы [ 6 ]

29 голосов
/ 14 ноября 2010

Для логических значений они означают одно и то же - хотя для XOR есть составной оператор присваивания:

x ^= y;

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

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

20 голосов
/ 14 ноября 2010

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

Результат! = Равен false, если оба операнда имеют значение true или оба 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

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

4 голосов
/ 14 ноября 2010

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

3 голосов
/ 14 ноября 2010

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

Пример:

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

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

0 голосов
/ 14 ноября 2010

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

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

0 голосов
/ 14 ноября 2010

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

...