Какая разница между 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
С уважением,
// т