【问题标题】:How to invert ternary conditional expression depending on boolean value?如何根据布尔值反转三元条件表达式?
【发布时间】:2018-08-16 07:21:43
【问题描述】:

我正在寻找一种基于布尔参数反转条件表达式的方法。当然,这可以通过以下方式完成:

public int do(bool b)
{  
    if (b)
       return this.a ? 1 : 0;
    else 
       return this.a ? 0 : 1;
}

但是,将整个函数变成一个单行函数会很有帮助。所以,就逻辑表达式而言,我正在寻找一个操作 ∘以某种方式组合a 和b

一个 ∘ b = 一个

一个 ∘ (¬b) = ¬a

问题:有这样的逻辑运算(或运算组合)吗?

【问题讨论】:

  • 如果你的方法有一个返回类型会更有意义。看起来您想将 a 和 b 与 xnor 结合起来,然后将其转换为当前的 int。
  • @Damien_The_Unbeliever 我修复了示例代码,谢谢。
  • 好吧,看起来如果b == this.a 那么你想返回true,否则返回false。为什么不直接检查b 和this.a?

标签: c# logical-operators


【解决方案1】:

看起来我们想要 xnor:

return (!(a ^ b)) ? 1 : 0;

(但我们没有 xnor 运算符,所以我将 xor 与 not 结合在一起)

或者通过交换结果子表达式来简化:

return (a ^ b) ? 0 : 1;

【讨论】:

  • 我为那些会在生产代码中发现这一点的人感到难过。
  • @FCin - 好吧,我当然希望方法、属性和变量名称在生产代码中更具描述性。我也不热衷于这种 int 返回类型,但这正是 OP 所要求的。
  • 在bool 上,^ 不是和!= 一样吗?
  • 别担心,@FCin,这段代码只是为了描述问题而发布的;它不是生产代码。
  • @Rawling - 是的。然后归结为作者思考问题的方式。
【解决方案2】:

我建议的一个简单易懂的实现是:

return (b == this.a) ? 1 : 0;

因为根据您的原始代码,如果它们相等,您似乎想要返回 1,否则返回 0。

【讨论】:

  • 谢谢@mjwills,这看起来是最简洁的实现。但是,我接受了 Damien_The_Unbeliever 的回答,因为我提到了我正在寻找的逻辑运算符。
【解决方案3】:

当然,这是你需要的方法,inverted XOR:

public int do(bool b)
{  
    return b ^ this.a ? 0 : 1;
}

【讨论】:

  • 这不会编译,因为bool -> int 不是允许的隐式转换。
  • @Damien_The_Unbeliever 是的,恕我直言,使用三元运算符将是最简单的转换方式。
【解决方案4】:

您可以创建嵌套的三元条件:

public int do(bool b)
{  
   return b ? (this.a ? 1 : 0) : (this.a ? 0 : 1);
}

或由内而外:

public int do(bool b)
{  
   return this.a ? (b ? 1 : 0)
}

或者在你的例子中,它更简单:

public int do(bool b)
{  
    return a && b; // edit: won't work for !a !b, also int-cast missing...
}

如果你在真值表中找到一个逻辑表达式,这很容易:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多