在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
)可能不是两个,而是三个值: undefined
, true
或false
而另一个( term2
)可能是true
或false
。 我必须为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”:))。