157

我个人喜欢排他性 or , ^, 运算符,因为它的简洁性在布尔检查的上下文中是有意义的。我更喜欢写作

if (boolean1 ^ boolean2)
{
  //do it
}

if((boolean1 && !boolean2) || (boolean2 && !boolean1))
{
  //do it
}

但我经常从其他有经验的 Java 开发人员(不仅仅是新手)那里得到困惑,有时会评论它应该如何只用于按位运算。

我很好奇关于^操作员使用的最佳实践。

4

12 回答 12

310

您可以简单地使用!=

于 2008-10-02T02:59:29.920 回答
27

我想你已经回答了你自己的问题——如果你从别人那里得到奇怪的表情,那么选择更明确的选项可能更安全。

如果您需要对其发表评论,那么您最好用更详细的版本替换它,而不是让人们首先提出问题。

于 2008-10-02T03:34:54.033 回答
18

我发现我有很多类似的对话。一方面,你有一个紧凑、有效的方法来实现你的目标。另一方面,你有一些团队其他成员可能不理解的东西,这使得将来很难维护。

我的一般规则是询问所使用的技术是否是期望程序员普遍知道的合理的东西。在这种情况下,我认为期望程序员知道如何使用布尔运算符是合理的,因此在 if 语句中使用 xor 是可以的。

举个不太好的例子,使用 xor 来交换两个变量而不使用临时变量。这是一个我不希望每个人都熟悉的技巧,所以它不会通过代码审查。

于 2008-10-02T05:00:48.287 回答
14

我想如果你评论它就可以了,例如// ^ == XOR

于 2008-10-02T02:59:38.953 回答
11

你总是可以把它包装在一个函数中,给它一个详细的名字:

public static boolean XOR(boolean A, boolean B) {
    return A ^ B;
}

但是,在我看来,对于任何不知道 ^ 运算符的用途的人来说,谷歌搜索它并不难。在第一次之后记住它并不难。由于您要求其他用途,因此通常使用 XOR 进行位掩码。

您还可以使用 XOR 来交换两个变量中的值,而无需使用第三个临时变量

// Swap the values in A and B
A ^= B;
B ^= A;
A ^= B;

这是一个与 XOR 交换相关的 Stackoverflow 问题

于 2013-02-22T18:28:52.193 回答
5
if((boolean1 && !boolean2) || (boolean2 && !boolean1)) 
{ 
  //do it 
} 

恕我直言,此代码可以简化:

if(boolean1 != boolean2) 
{ 
  //do it 
} 
于 2010-04-10T08:33:35.980 回答
5

考虑到代码的清晰性,我认为在布尔检查中使用 XOR 并不是 XOR 位运算符的典型用法。根据我的经验,Java 中的按位异或通常用于实现掩码flag toggle行为:

flags = flags ^ MASK;

Vipan Singla 的这篇文章更详细地解释了使用案例。

如果您需要在示例中使用按位 XOR,请评论您使用它的原因,因为它可能需要即使是按位识字的观众也需要停下来了解您使用它的原因。

于 2012-10-21T05:11:36.453 回答
-2

由于简洁,我个人更喜欢“boolean1 ^ boolean2”表达式。

如果我处于您的情况(在团队中工作),我会通过将“boolean1 ^ boolean2”逻辑封装在具有描述性名称(例如“isDifferent(boolean1, boolean2)”的函数中)来达成妥协。

例如,不要使用“boolean1 ^ boolean2”,而是调用“isDifferent(boolean1, boolean2)”,如下所示:

if (isDifferent(boolean1, boolean2))
{
  //do it
}

您的“isDifferent(boolean1, boolean2)”函数如下所示:

private boolean isDifferent(boolean1, boolean2)
{
    return boolean1 ^ boolean2;
}

当然,这个解决方案需要使用一个表面上无关的函数调用,它本身受到最佳实践审查,但它避免了冗长(和丑陋)的表达式“(boolean1 && !boolean2) || (boolean2 && !boolean1) “!

于 2017-08-12T04:39:17.303 回答
-3

如果使用模式证明它是合理的,为什么不呢?虽然您的团队不会立即识别操作员,但随着时间的推移他们可以。人类一直在学习新单词。为什么不在编程中?

我可能要说的唯一警告是“^”没有第二个布尔检查的短路语义。如果你真的需要短路语义,那么静态 util 方法也可以。

public static boolean xor(boolean a, boolean b) {
    return (a && !b) || (b && !a);
}
于 2008-10-02T03:03:02.110 回答
-3

!= 可以比较两个变量。但是,通过多重比较,它不起作用。

于 2009-02-05T10:13:25.503 回答
-3

作为按位运算符,xor 比任何其他替换它的方法都要快得多。因此,对于性能关键和可扩展的计算,xor 是必不可少的。

我的主观个人意见:绝对禁止出于任何目的使用相等(== 或!=)作为布尔值。使用它表明缺乏基本的编程道德和基础。任何让你困惑的人都应该把 ^ 送回布尔代数的基础(我很想在这里写“信仰之河”:))。

于 2011-03-24T16:44:09.557 回答
-4
str.contains("!=") ^ str.startsWith("not(")

对我来说看起来比

str.contains("!=") != str.startsWith("not(")
于 2010-11-17T14:54:47.453 回答