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

时间:2010-11-14 00:21:32

标签: boolean xor evaluation

我的问题以Java为例,但我想它可能适用于所有。

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

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

6 个答案:

答案 0 :(得分:29)

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

x ^= y;

对于不等式,没有等效的复合赋值运算符。

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

答案 1 :(得分:20)

Java Language Specification 中所述:

  

如果操作数都为true或两者都为false,则!=的结果为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

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

答案 2 :(得分:4)

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

答案 3 :(得分:3)

使用布尔值,应该没有区别。你应该选择更合适的操作方式。

示例:

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

此处XOR会给出相同的结果,但不会反映实际的代码意图。

答案 4 :(得分:0)

在这种情况下它们应该基本相同。

答案 5 :(得分:0)

有一个很大的区别,XOR在位级工作,保持差异为一, 所以0b0011 xor 0b1101 => 0b1110

的问候, //吨