由于其简洁性,我个人喜欢在布尔检查的上下文中有意义的,或者,^
运算符.我更喜欢写作
if (boolean1 ^ boolean2) { //do it }
比
if((boolean1 && !boolean2) || (boolean2 && !boolean1)) { //do it }
但是我常常从其他有经验的Java开发人员(不仅仅是新手)那里得到一些困惑,有时会评论它应该如何仅用于按位操作.
我很好奇关于^
运营商使用的最佳实践.
你可以简单地使用!=
.
我想你已经回答了自己的问题 - 如果你从别人那里得到奇怪的外表,那么选择更明确的选项可能会更安全.
如果你需要对它进行评论,那么你最好用更详细的版本替换它,而不是让人们首先提出问题.
我发现我有很多类似的对话.一方面,您有一种紧凑,有效的方法来实现您的目标.另一方面,你有一些其他团队可能无法理解的东西,使得将来很难维护.
我的一般规则是询问所使用的技术是否是合理的,期望程序员一般都知道.在这种情况下,我认为期望程序员知道如何使用布尔运算符是合理的,因此在if语句中使用xor是可以的.
作为一些不合适的例子,请使用xor交换两个变量而不使用临时变量.这是一个我不希望每个人都熟悉的技巧,所以它不会通过代码审查.
如果您评论它,我认为没关系,例如// ^ == XOR
.
你总是可以将它包装在一个函数中,以给它一个详细的名称:
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问题.
我最近在工作中的JavaScript项目中使用了xor,最后添加了7行注释来解释发生了什么.在这种情况下使用异或的理由是,术语(之一term1
在下面的示例)可以采取不是两个而是三个值:undefined
,true
或false
而另一个(term2
)可以是true
或false
.我将不得不为undefined
案例添加额外的检查,但是使用xor,以下就足够了,因为xor强制第一个术语首先被评估为布尔值,让我们undefined
将其视为false
:
if (term1 ^ term2) { ...
最后,它有点矫枉过正,但无论如何我想把它留在那里,就像一个复活节彩蛋.
if((boolean1 && !boolean2) || (boolean2 && !boolean1)) { //do it }
恕我直言这个代码可以简化:
if(boolean1 != boolean2) { //do it }
考虑到代码清晰度,我的观点是在布尔检查中使用XOR不是XOR位运算符的典型用法.根据我的经验,Java中的按位XOR 通常用于实现掩码flag toggle
行为:
flags = flags ^ MASK;
Vipan Singla撰写的这篇文章更详细地解释了用例.
如果你需要在你的例子中使用按位XOR,请评论你使用它的原因,因为它甚至可能需要一个有点文化的读者停下来理解你使用它的原因.