Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用xor运算符进行布尔检查是否是一种良好的做法?_Java_Conditional_Bitwise Operators_Logical Operators_Xor - Fatal编程技术网

Java 使用xor运算符进行布尔检查是否是一种良好的做法?

Java 使用xor运算符进行布尔检查是否是一种良好的做法?,java,conditional,bitwise-operators,logical-operators,xor,Java,Conditional,Bitwise Operators,Logical Operators,Xor,我个人喜欢异或运算符,^,因为它的简洁性在布尔检查的上下文中很有意义。我更喜欢写作 if (boolean1 ^ boolean2) { //do it } 但是,我经常会对其他有经验的Java开发人员(不仅仅是新手)的看法感到困惑,有时还会对如何将其仅用于按位操作进行评论 我很好奇关于^操作符使用的最佳实践。您只需使用=。我认为如果您对它进行了注释就可以了,例如,/^==XOR如果使用模式证明它是正确的,为什么不呢?虽然您的团队无法立即识别操作员,但随着时间的推移,他们可以。人类一直在

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

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

但是,我经常会对其他有经验的Java开发人员(不仅仅是新手)的看法感到困惑,有时还会对如何将其仅用于按位操作进行评论


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

您只需使用
=

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

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

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

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

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


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

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

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


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

!=比较两个变量是可以的。但是,在多重比较中,这是行不通的

if((boolean1 && !boolean2) || (boolean2 && !boolean1)) 
{ 
  //do it 
} 
IMHO该代码可以简化为:

if(boolean1 != boolean2) 
{ 
  //do it 
} 
对我来说比

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

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


我个人的主观意见是:无论出于何种目的,绝对禁止对布尔人使用平等(=或!=)。使用它表明缺乏基本的编程道德和基础知识。任何对布尔代数产生困惑的人都应该回到布尔代数的基础知识上来(我很想在这里写“信念河”)。

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

flags = flags ^ MASK;
Vipan Singla的文章更详细地解释了这个用例


如果您需要像您的示例中那样使用位异或,请说明为什么要使用它,因为即使是懂位的读者也可能需要停下来了解您为什么要使用它

您可以将其包装在函数中,为其指定一个详细的名称:

public static boolean XOR(boolean A, boolean B) {
    return A ^ B;
}
但是,在我看来,对于那些不知道^operator是干什么的人来说,用谷歌快速搜索它并不难。第一次之后,就不难记住了。因为您要求其他用途,所以通常使用异或进行位屏蔽

你也可以

这里有一个。

我个人更喜欢“boolean1^boolean2”表达式,因为它简洁

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

例如,不使用“boolean1^boolean2”,您可以这样调用“isDifferent(boolean1,boolean2)”:

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

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

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

我不认为xor有任何短路可能-你必须知道a和b来计算结果。而且,参数将在调用时计算,因此不会发生任何短路。此外,xor应该是机器级别的单个操作。您可能应该查找短路评估和延迟评估之间的差异。短curcuit求值是一种代码样式,用于防止调用会导致运行时错误,例如被零除。在C中,这可以是“if(分母!=0&&分子/分母)”,它自身利用延迟求值来防止被零除。你的答案也纯粹是推测性的。老实说,一个程序员编写一个函数
xor
,这个函数与xor操作符的功能完全相同,但却以一种迂回的方式,这会比一个只使用
^
的程序员在我脑海中提出更多的问题(特别是关于能力)
bool1^bool2^bool3
bool1!=bool2!=bool3
我的大脑受伤了。你也可以是否产生不正确的结果?@vemv,
=
布尔值
s生成正确的结果(但不是为
布尔值
s生成正确的结果,因此请小心)。但它并不总是很漂亮,例如
(some!=null)!=(other!=null)
可读性不强。您要么提取显式布尔值中的部分,要么提取
=在一个单独的方法中。原因如下:
a^b
=>
public static boolean XOR(boolean A, boolean B) {
    return A ^ B;
}
// Swap the values in A and B
A ^= B;
B ^= A;
A ^= B;
if (isDifferent(boolean1, boolean2))
{
  //do it
}
private boolean isDifferent(boolean1, boolean2)
{
    return boolean1 ^ boolean2;
}