我的问题以 Java 为例,但我想它可能适用于所有人。
在比较布尔值时,XOR 运算符(^
在 Java 中)和不等于运算符(在 Java 中)之间有什么实际区别吗?!=
我在这里评估了一些东西,但我一直在想(看起来很奇怪,两件事相等)......并且没有在网上找到任何东西。只是某个论坛中的一次讨论很快就结束了,没有任何结果。
我的问题以 Java 为例,但我想它可能适用于所有人。
在比较布尔值时,XOR 运算符(^
在 Java 中)和不等于运算符(在 Java 中)之间有什么实际区别吗?!=
我在这里评估了一些东西,但我一直在想(看起来很奇怪,两件事相等)......并且没有在网上找到任何东西。只是某个论坛中的一次讨论很快就结束了,没有任何结果。
对于布尔值,它们的含义相同——尽管有一个用于 XOR 的复合赋值运算符:
x ^= y;
不等式没有等效的复合赋值运算符。
至于为什么它们都可用 - XOR不可用会很奇怪,因为它的工作方式与不等式相同。它应该在逻辑上在那里,所以它是。对于非布尔类型,结果是不同的,因为它是不同的结果类型,但这并不意味着删除 XOR for 是有意义的boolean
。
如Java 语言规范中所述:
如果操作数都为真或都为假,!= 的结果为假;否则,结果为真。因此,当应用于布尔操作数时,!= 的行为与 ^(第 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
这确保了除了相同的语义之外,在实现上没有任何实际的实际差异。(您还可以看到内部整数用于存储布尔值)
是的,您可以使用 XOR 来测试布尔值的(不)相等性,尽管代码不太直观:if (x ^ y)
与if (x != y)
.
使用布尔值,应该没有区别。您应该选择更适合您的操作感的。
例子:
bool oldChoice = ...;
bool newChoice = ...;
if (oldChoice != newChoice)
...
这里XOR
会给出相同的结果,但不会反映真实的代码意图。
在这种情况下,它们应该基本相同。
有很大的不同,异或工作在位级别,保持差异为一,所以 0b0011 xor 0b1101 => 0b1110
问候,//t