代码之家  ›  专栏  ›  技术社区  ›  Peter

使用xor运算符进行布尔检查是一个好的实践吗?

  •  145
  • Peter  · 技术社区  · 16 年前

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

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

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

    但我经常会从其他有经验的Java开发人员(不仅仅是新手)中得到困惑,有时会评论它应该如何只用于按位操作。

    我很好奇关于 ^ 操作员。

    13 回复  |  直到 6 年前
        1
  •  291
  •   vaxquis user2577497    7 年前

    你可以简单地使用 != 相反。

        2
  •  27
  •   Martin    16 年前

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

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

        3
  •  16
  •   nbro Wei    6 年前

    我发现我有很多相似的对话。一方面,你有一个紧凑、高效的方法来实现你的目标。另一方面,您的团队中的其他人可能不理解您所拥有的东西,这使得将来很难维护它。

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

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

        4
  •  14
  •   nbro Wei    6 年前

    我想如果你评论的话没关系,比如 // ^ == XOR .

        5
  •  8
  •   zb226 Steven Lizarazo    7 年前

    您可以始终将其包装在一个函数中,为其提供一个详细的名称:

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

    但是,在我看来,对于那些不知道^操作员是干什么的人来说,用谷歌快速搜索并不难。第一次之后就不难记住了。因为您要求其他用途,所以通常使用xor进行位屏蔽。

    你也可以 use XOR to swap the values in two variables without using a third temporary variable .

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

    这里有一个 Stackoverflow question related to XOR swapping .

        6
  •  6
  •   nbro Wei    6 年前

    我最近在工作中的一个JavaScript项目中使用了一个XOR,并且 最后添加了7行评论 解释发生了什么。在这种情况下使用XOR的理由是( term1 在下面的示例中),可以不取两个值,而是取三个值: undefined , true false 而另一个( term2 可能是 . 我得再加一张支票 未定义 但对于XOR,以下是足够的,因为XOR强制第一个术语首先作为布尔值进行计算,从而 未定义 被当作 :

    if (term1 ^ term2) { ...
    

    最后,这有点过分了,但我还是想把它放在里面,就像复活节彩蛋一样。

        7
  •  5
  •   Y--    14 年前
    if((boolean1 && !boolean2) || (boolean2 && !boolean1)) 
    { 
      //do it 
    } 
    

    imho此代码可以简化:

    if(boolean1 != boolean2) 
    { 
      //do it 
    } 
    
        8
  •  5
  •   nbro Wei    6 年前

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

    flags = flags ^ MASK;
    

    This Vipan Singla的文章更详细地解释了使用案例。

    如果您需要像在示例中那样使用位异或,请说明为什么要使用它,因为它可能要求即使是位识字的观众也要停下来了解您为什么要使用它。

        9
  •  -1
  •   Alan    16 年前

    如果使用模式证明了这一点,为什么不呢?虽然你的团队不能马上识别操作员,但他们可以。人类一直在学习新词。为什么不在编程中呢?

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

    public static boolean xor(boolean a, boolean b) {
        return (a && !b) || (b && !a);
    }
    
        10
  •  -1
  •   ONE dilipkaklotar    7 年前

    我个人更喜欢“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&&!布尔2)(布尔2&&!“BuloLang1”!

        11
  •  -3
  •   Con    15 年前

    !=可以比较两个变量。不过,如果进行多次比较,这是行不通的。

        12
  •  -3
  •   Henrik Heimbuerger Kenneth Reitz    13 年前
    str.contains("!=") ^ str.startsWith("not(")
    

    对我来说比

    str.contains("!=") != str.startsWith("not(")
    
        13
  •  -3
  •   Nick    13 年前

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

    我个人的主观看法是:绝对禁止出于任何目的使用平等。=)对于布尔值。使用它表明缺乏基本的编程伦理和基本原理。任何让你困惑的人都应该被送回布尔代数的基础知识(我想在这里写“信仰之河”)。