在Java中使用XOR(^)运算符进行布尔检查是不是很好?

我个人喜欢“独占”或“操作符”,因为它的简洁性,在布尔检查的上下文中是有意义的。 我更喜欢写作

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

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

但是我经常会从其他有经验的java开发人员(而不仅仅是新手)中感到困惑,并且有时会评论如何仅将它用于按位操作。 我很好奇其他人使用“^”运算符的最佳实践。

您可以简单地使用!=来代替。

我想你已经回答了你自己的问题 – 如果你从人们那里得到奇怪的表情,用更明确的选项去更安全。

如果你需要评论一下,那么你可能会更好地用更复杂的版本replace它,而不是让人们首先提出这个问题。

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

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

作为一个不好的例子,可以使用xor来交换两个variables,而不使用临时variables。 这是一个窍门,我不希望每个人都熟悉,所以它不会通过代码审查。

我想如果你评论它会没问题的,例如// ^ == XOR

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

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

但是,在我看来,对于那些不知道运营商对Google来说真的很快的人来说,并不难。 第一次之后不难记得。 既然你问了其他用途,通常使用XOR进行位屏蔽。

您也可以使用XOR交换两个variables中的值,而不使用第三个临时variables 。

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

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

我最近在一个JavaScript项目中使用了一个xor, 最后添加了7行注释来解释发生了什么。 在这种情况下使用xor的理由是,其中一个术语(下面例子中的term1 )可能不是两个,而是三个值: undefinedtruefalse而另一个( term2 )可能是truefalse 。 我必须为undefined情况添加一个额外的检查,但是使用异或时,以下就足够了,因为异或迫使第一个任务首先被评估为布尔值,让undefined被视为false

  if (term1 ^ term2) { ... 

最后有点过分了,但是我想把它保持在那里,就像一个复活节彩蛋。

@马丁:我认为这是你已经说过的一个很好的例子:

如果你需要评论一下,那么你可能会更好地用更复杂的版本replace它,而不是让人们首先提出这个问题。

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

 flags = flags ^ MASK; 

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

净,如果你需要使用按位异或作为你的例子,评论你为什么使用它,因为它可能需要即使是有识字的读者停下来,以理解你为什么使用它。

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

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

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

如果使用模式合理,为什么不呢? 虽然你的团队不能马上识别出操作员,但他们可以随时做出反应。 人类总是在学习新词。 为什么不在编程?

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

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

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

如果我在你的情况下(在一个团队中工作),我会通过将“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; } 

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

!=可以比较两个variables。 它不起作用,但是,多重比较。

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

对我来说比我好看

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

作为一个按位运算符,xor比任何其他方法要快得多。 所以对于性能关键和可扩展的计算,xor是必不可less的。

我的主观个人观点:为了任何目的,绝对禁止布尔人使用平等(==或!=)。 使用它显示缺乏基本的编程道德和基本原则。 任何让你困惑的人都应该回到布尔代数的基础(我试图在这里写下“信仰的河stream”:))。