java - 使用xor运算符进行布尔检查是一种好习惯吗?
我个人喜欢独家或^运算符,因为它的简洁性在布尔检查的上下文中是有意义的。 我更喜欢写作
if (boolean1 ^ boolean2)
{
//do it
}
比
if((boolean1 && !boolean2) || (boolean2 && !boolean1))
{
//do it
}
但我常常从其他有经验的Java开发人员(不仅仅是新手)那里得到一些困惑,有时会评论它应该如何仅用于按位操作。
我很好奇关于使用^运算符的最佳实践。
13个解决方案
289 votes
您只需使用!=即可。
vaxquis answered 2019-05-13T15:17:20Z
27 votes
我想你已经回答了自己的问题 - 如果你从别人那里得到奇怪的外表,那么选择更明确的选项可能会更安全。
如果你需要对它进行评论,那么你最好用更详细的版本替换它,而不是让人们首先提出问题。
Martin answered 2019-05-13T15:17:53Z
16 votes
我发现我有很多类似的对话。 一方面,您有一种紧凑,有效的方法来实现您的目标。 另一方面,你有一些其他团队可能无法理解的东西,使得将来很难维护。
我的一般规则是询问所使用的技术是否是合理的,期望程序员一般都知道。 在这种情况下,我认为期望程序员知道如何使用布尔运算符是合理的,因此在if语句中使用xor是可以的。
作为一些不合适的例子,请使用xor交换两个变量而不使用临时变量。 这是一个我不希望每个人都熟悉的技巧,所以它不会通过代码审查。
Dave Tarkowski answered 2019-05-13T15:18:36Z
14 votes
如果你评论它,我认为没关系,例如// ^ == XOR。
Dre answered 2019-05-13T15:19:03Z
8 votes
你总是可以将它包装在一个函数中,以给它一个详细的名称:
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问题。
Cory Gross answered 2019-05-13T15:19:54Z
6 votes
我最近在一个JavaScript项目中使用了xor,最后添加了7行注释来解释发生了什么。 在该上下文中使用xor的理由是其中一个术语(下面示例中的term1)可能不是两个而是三个值:undefined,true或false而另一个(term2)可能是true或false。我会 必须为undefined案例添加额外的检查但是使用xor,以下就足够了,因为xor强制第一个术语首先被评估为布尔值,让undefined被视为false:
if (term1 ^ term2) { ...
最后,它有点矫枉过正,但无论如何我想把它留在那里,就像一个复活节彩蛋。
Ates Goral answered 2019-05-13T15:20:36Z
5 votes
if((boolean1 && !boolean2) || (boolean2 && !boolean1))
{
//do it
}
恕我直言这个代码可以简化:
if(boolean1 != boolean2)
{
//do it
}
Y-- answered 2019-05-13T15:21:06Z
5 votes
考虑到代码清晰度,我的观点是在布尔检查中使用XOR不是XOR位运算符的典型用法。 根据我的经验,Java中的按位XOR通常用于实现掩码flag toggle行为:
flags = flags ^ MASK;
Vipan Singla撰写的这篇文章更详细地解释了用例。
如果你需要在你的例子中使用按位XOR,请评论你使用它的原因,因为它甚至可能需要一个有点文化的读者停下来理解你使用它的原因。
Gunnar Karlsson answered 2019-05-13T15:21:56Z
-1 votes
如果使用模式证明了它,为什么不呢? 虽然您的团队不会立即认出操作员,但他们可以随时使用。 人类一直在学习新单词。 为什么不在编程?
我可能唯一要注意的是“^”没有第二次布尔检查的短路语义。 如果你真的需要短路语义,那么静态util方法也可以。
public static boolean xor(boolean a, boolean b) {
return (a && !b) || (b && !a);
}
Alan answered 2019-05-13T15:22:34Z
-1 votes
由于其简洁性,我个人更喜欢“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& amp; ;&!boolean1)“!
ONE answered 2019-05-13T15:23:34Z
-3 votes
!=可以比较两个变量。 但是,通过多重比较,它不起作用。
answered 2019-05-13T15:24:04Z
-3 votes
str.contains("!=") ^ str.startsWith("not(")
看起来比我更好
str.contains("!=") != str.startsWith("not(")
Chris Rea answered 2019-05-13T15:24:32Z
-3 votes
作为一个按位运算符,xor比任何其他替换它的方法快得多。 因此,对于性能关键和可扩展的计算,xor是必不可少的。
我的主观个人观点:出于任何目的,绝对禁止对布尔值使用相等(==或!=)。 使用它表明缺乏基本的编程伦理和基础知识。 任何让你困惑的人都应该被发送回布尔代数的基础知识(我很想在这里写“信仰的河流”:))。
Nick answered 2019-05-13T15:25:12Z