2010-11-14 3 views
21

Мой вопрос использует Java в качестве примера, но я предполагаю, что это применимо к возможно всем.В чем разница между XOR и NOT-EQUAL-TO?

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

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

+0

Некоторые связанные с этим обсуждения в этом вопросе (я лично не считаю это дубликат, например): http://stackoverflow.com/questions/160697/is-it-good-practice-to-use-the- xor-operator-in-java-for-boolean-checks – eldarerathis

+0

Тангенциальное примечание. Как сказано ниже, два оператора означают одно и то же для булевых. Это не так в общем случае, по крайней мере, на C++. Поскольку операторы могут быть перегружены в C++, операторы '! =' И '^' могут или не могут делать то же самое. Кроме того, использование '! =' В отличие от '^' делает достаточно ясным, что выполняется проверка неравенства. –

+0

Извините, я даже не видел этого вопроса, может быть, потому, что названия разные, и верификатор вопроса не поймал его. Во всяком случае, ответы здесь были намного лучше и просвещенны, по моему скромному мнению. О том, что там сказано ... Я склонен согласиться: если вы собираетесь сохранить одну из нескольких букв, которые оставляют код более неясным, я предпочитаю переводить многословие. Я буду придерживаться! = В этих ситуациях. – davidcesarino

ответ

26

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

x ^= y; 

Там нет эквивалента присваивания, оператор для неравенства.

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

+0

Да, это были мои мысли точно! Я просто хотел убедиться, потому что, вообще говоря, я не вижу много вещей, которые по существу одинаковы для одной цели (бритва Оккама, я думаю ...). Эта проблема, очевидно, не относится к троичному, что, конечно, является лучшим способом и более чистым способом сделать то же самое. Но с моим делом здесь все равно. Но да, вы были правы по этому вопросу и моему вопросу. Спасибо. – davidcesarino

0

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

0

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

приветом // т

+4

ах, сравнение булевых ... Нет, никакой разницы .. – Teson

3

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

3

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

Пример:

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

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

19

Как указано в Java Language Specification:

Результат = ложно, если операнды являются истинными или ложными; в противном случае результат будет истинным. Таким образом,! = Ведет себя так же, как^(§ 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 

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

+0

Большое спасибо за то, что это глубокое объяснение того, как это работает! – davidcesarino

Смежные вопросы