XOR 和 NOT-EQUAL-TO 有啥区别?

Posted

技术标签:

【中文标题】XOR 和 NOT-EQUAL-TO 有啥区别?【英文标题】:What's the difference between XOR and NOT-EQUAL-TO?XOR 和 NOT-EQUAL-TO 有什么区别? 【发布时间】:2011-05-09 16:42:36 【问题描述】:

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

在比较布尔值时,XOR 运算符(Java 中的^)和不等于运算符(Java 中的!=)之间有什么实际区别吗?

我在这里评估了一些东西,但我一直在想(看起来很奇怪,两个东西相等)......并且在网上没有找到任何东西。只是某个论坛上的一次讨论很快就结束了,没有任何结果。

【问题讨论】:

这个问题中的一些相关讨论(我个人认为它不会重复):***.com/questions/160697/… 切题:正如下面的答案所说,这两个运算符对布尔值表示相同的含义。这在一般情况下是不正确的,至少在 C++ 中是这样。由于运算符可以在 C++ 中重载,运算符 !=^ 可能会或可能不会做同样的事情。此外,使用 != 而不是 ^ 可以清楚地表明正在执行不等式测试。 对不起,我什至没有看到那个问题,可能是因为标题不同,问题验证器没有抓住它。无论如何,以我的拙见,这里的答案要好得多且开明得多。关于那里所说的...我倾向于同意:如果您要保存一些使代码更加模糊的字母之一,我更喜欢冗长。在这些情况下,我会坚持使用 !=。 在 silico 中,这就是为什么我说“java”只是为了确定。我担心与其他语言相比可能会有所不同。 related 【参考方案1】:

Java Language Specification所述:

如果操作数都为真或都为假,!= 的结果为假;否则,结果为真。因此,当应用于布尔操作数时,!= 的行为与 ^(第 15.22.2 节)相同。

此外,如果您尝试查看简单 sn-p 的字节码:

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是用来存储布尔值的)

【讨论】:

非常感谢您对其工作原理的深入解释! @Jack 为这个简单的方法提供字节码是没用的,JITdoes the really beautiful things @Eugene:我们处理的是语义,而不是性能。 JIT 做的很好,但需要保持原始字节码的语义。所以分析性能差异是一个很好的补充,但不会降低字节码的用处。实际上,我可以同时争辩说微基准是无用的:)【参考方案2】:

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

x ^= y;

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

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

【讨论】:

是的,这正是我的想法!我只是想确定一下,因为一般来说,我看不到很多本质上相同的东西服务于一个相同的目的(我猜是奥卡姆剃刀……)。这种担忧显然不适用于三元,这当然是做同样事情的更好和更清洁的方式。但就我这里的情况而言,它真的是一样的。但是,是的,你在这个问题和我的问题上是对的。谢谢。【参考方案3】:

对于布尔值,应该没有区别。您应该选择更适合您的操作感的。

例子:

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

这里XOR 会给出相同的结果,但不会反映真正的代码意图。

【讨论】:

【参考方案4】:

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

【讨论】:

这两种方式都不太直观吗?我的意思是,如果我们用 not equal 代替 xor 会不会更直观?【参考方案5】:

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

问候, //t

【讨论】:

OP 明确表示“比较布尔值时”【参考方案6】:

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

【讨论】:

以上是关于XOR 和 NOT-EQUAL-TO 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别