如何编写以下布尔表达式?

Vil*_*lx- 1 boolean-expression

我有三个布尔值A,B和C.我需要编写一个IF语句,当且仅当这些值中不超过一个为True时才会执行.换句话说,这是真值表:

 A | B | C | Result
---+---+---+--------
 0 | 0 | 0 |   1
 0 | 0 | 1 |   1
 0 | 1 | 0 |   1
 0 | 1 | 1 |   0
 1 | 0 | 0 |   1
 1 | 0 | 1 |   0
 1 | 1 | 0 |   0
 1 | 1 | 1 |   0
Run Code Online (Sandbox Code Playgroud)

写这个的最好方法是什么?我知道我可以列举所有可能性,但这似乎......太冗长了.:P

补充:刚才有一个想法:

!(A && B)&&!(B && C)&&!(A && C)

这将检查没有设置两个值.关于总和的建议也是可以的.更可读也许......

(A≥1:0)+(B≤1:0)+(C≥1:0)<= 1

PS这是用于生产代码,所以我的代码可读性要高于性能.

补充2:已经接受的答案,但对于好奇的答案 - 它是C#.:)这个问题几乎与语言无关.

Dav*_*und 11

如何将它们视为整数1和0,并检查它们的总和等于1?

编辑:

既然我们知道它是c#.net,我认为最具可读性的解决方案看起来有点像

public static class Extensions
{
    public static int ToInt(this bool b)
    {
        return b ? 1 : 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

上面隐藏在一个类库(appcode?)中,我们没有看到它,但可以轻松访问它(例如ctrl +在r#中单击),然后实现将只是:

public bool noMoreThanOne(params bool[] bools) 
{ 
    return bools.ToList().Sum(b => b.ToInt()) <= 1; 
}
Run Code Online (Sandbox Code Playgroud)

...

bool check = noMoreThanOne(true, true, false, any, amount, of, bools);
Run Code Online (Sandbox Code Playgroud)

  • 总和等于1或0. (7认同)

Pas*_*nen 9

你会熟悉卡诺的地图.概念通常应用于电子产品,但在这里也非常有用.这很容易(维基百科的解释看起来很长 - 很彻底).


Vic*_*cky 6

(A或B XOR C)或不(A或B或C)

编辑:正如Vilx所指出的,这是不对的.

如果A和B均为1,且C为0,则A XOR B为0,整体结果为0.

怎么样:NOT(A和B)和NOT(A和C)和NOT(B和C)