XOR和NOT-EQUAL-TO之间有什么区别?

dav*_*ino 27 evaluation boolean xor

我的问题使用Java作为例子,但我想它可能适用于所有.

在比较布尔值时,XOR运算符(在java中是^)和NOT-EQUAL-TO(在java中是!=)之间是否存在实际差异?

我在这里评估了一些东西,但我一直在想(似乎很奇怪,两件事情相等)......并且没有在网上找到任何东西.在一些论坛中只有一次讨论快速结束而没有任何结果.

Jon*_*eet 30

对于布尔值,它们的含义相同 - 尽管XOR有一个复合赋值运算符:

x ^= y;
Run Code Online (Sandbox Code Playgroud)

对于不等式,没有等效的复合赋值算子.

至于为什么他们都可以-这将是奇怪的XOR为可用,只是因为它的工作方式是相同的不平等.它应该在逻辑上存在,所以它是.对于非布尔类型,结果是不同的,因为它是一个不同的结果类型,但这并不意味着删除XOR是有意义的boolean.


Jac*_*ack 22

Java语言规范中所述:

如果操作数都为true或两者都为false,则!=的结果为false; 否则,结果是真的.因此,当应用于布尔操作数时,!=与^(§15.22.2)的行为相同.

此外,如果您尝试查看简单代码段的字节码:

void test(boolean b1, boolean b2) {
    boolean res1 = b1^b2;
    boolean res2 = b1!=b2;
}
Run Code Online (Sandbox Code Playgroud)

你获得:

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
Run Code Online (Sandbox Code Playgroud)

这确保了除了相同的语义之外,在实现中没有任何实际的实际差异.(您还可以看到内部int用于存储布尔值)


Luk*_*keH 5

是的,您可以使用 XOR 来测试布尔值是否相等,尽管代码不太直观:if (x ^ y)if (x != y).