使用xor运算符进行布尔检查是一种好习惯吗?

时间:2008-10-02 02:58:13

标签: java conditional bitwise-operators logical-operators xor

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

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

大于

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

但我经常对其他有经验的Java开发人员(不仅仅是新手)感到困惑,有时会评论它应该如何仅用于按位操作。

我很好奇关于使用^运算符的最佳做法。

13 个答案:

答案 0 :(得分:294)

您只需使用!=代替。

答案 1 :(得分:27)

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

如果你需要对它进行评论,那么你可能最好用更详细的版本替换它,而不是让人们首先提出这个问题。

答案 2 :(得分:16)

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

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

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

答案 3 :(得分:14)

我认为如果您对它进行评论就可以了,例如// ^ == XOR

答案 4 :(得分:9)

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

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

但是,在我看来,对于那些不知道^运算符对于Google来说非常快的人来说并不难。在第一次之后不难记住。由于您要求其他用途,因此通常使用XOR进行位屏蔽。

您也可以use XOR to swap the values in two variables without using a third temporary variable

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

这是Stackoverflow question related to XOR swapping

答案 5 :(得分:6)

我最近在工作的JavaScript项目中使用了xor,最后添加了7行注释来解释发生了什么。在该上下文中使用xor的理由是,其中一个术语(下例中的term1)可以采用不是两个而是三个值:undefinedtrue或{{1}而另一个(false)可以是term2true。我将不得不为false个案添加额外的检查但是使用xor,以下就足够了,因为xor强制第一个术语首先被评估为布尔值,让undefined被视为{ {1}}:

undefined

最后,有点矫枉过正,但无论如何我想把它留在那里,就像一个复活节彩蛋。

答案 6 :(得分:5)

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

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

if(boolean1 != boolean2) 
{ 
  //do it 
} 

答案 7 :(得分:5)

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

flags = flags ^ MASK;
Vipan Singla撰写的

This文章更详细地解释了用例。

如果你需要在你的例子中使用按位XOR,请注释你使用它的原因,因为它甚至可能需要一个有点文化的读者停下来理解你使用它的原因。

答案 8 :(得分:-1)

如果使用模式证明了这一点,为什么不呢?虽然您的团队不会立即认出操作员,但他们可以随时使用。人类一直在学习新单词。为什么不在编程?

我唯一要注意的是“^”没有第二次布尔检查的短路语义。如果你真的需要短路语义,那么静态的util方法也可以工作。

public static boolean xor(boolean a, boolean b) {
    return (a && !b) || (b && !a);
}

答案 9 :(得分:-1)

我个人更喜欢" boolean1 ^ boolean2"因其简洁而表达。

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

例如,您可以调用" isDifferent(boolean1,boolean2)"而不是使用" boolean1 ^ boolean2"像这样:

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

你的" isDifferent(boolean1,boolean2)"功能看起来像:

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

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

答案 10 :(得分:-3)

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

答案 11 :(得分:-3)

str.contains("!=") ^ str.startsWith("not(")

对我而言比

更好看
str.contains("!=") != str.startsWith("not(")

答案 12 :(得分:-3)

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

我的主观个人观点:出于任何目的,绝对禁止对布尔值使用平等(==或!=)。使用它表明缺乏基本的编程伦理和基础知识。任何让你困惑的人都应该被送回布尔代数的基础知识(我很想在这里写“信仰的河流”:))。