用逻辑运算符确定差异

Determine difference with logic operators

我有这行代码

bool b1 = true;
bool b2 = true;
bool b3 = true;

bool areDifferent = b1 ^ b2 ^ b3;

这有效,如果只有 2 个布尔值 (true XOR true) // false

但它不适用于 n 个布尔值 (true XOR true XOR true) // true

问题:使用 C# 逻辑运算符(AND、OR、XOR、XNOR)确定所有值是否相等(或不相等)的正确通用方法是什么

你有很多机会,最简单的是一个简单的 LINQ 语句:

var allEqual = myBools.Distinct().Count == 1;

交替循环您的值:

bool AllSame(IEnumerable<bool> bools)
{
    var b1 = myBools.First();
    foreach(var b = myBools.Skip(1))
        if(b != b1)
            return false;
    return true;
}

或者也只使用逻辑运算符:

请注意,您应该使用 ToArrayToList 来具体化集合,以避免同一集合的多次迭代。

好的,如果您坚持必须使用逻辑运算符的解决方案,这里有一个使用 XOR 运算符检查是否至少有一项与其余项不同的解决方案:

public bool IsAnyValueDifferentFromRest(params bool [] values)
{
    if (values.Any() == false)
    {
        throw new ArgumentException();
    }
    
    bool stillSame = values.First();
    
    foreach (var boolValue in values.Skip(1)) // stole the skip part from HimBrombeere
    {
        // at the first difference you find you can exit
        if (stillSame ^ boolValue)
        {
            return true;
        }
    }
    
    return false;
}

我会去:

bool b1 = true;
bool b2 = true;
bool b3 = true;

bool areSame = (b1 && b2 && b3) || !(b1 || b2 || b3);

如果它们都为真,则 AND 部分将 return 为真。 否则它将 return false.

如果它们都是假的,则 OR 部分将 return 假,NOT 将导致它 return 真。 否则 OR 部分 return 为真而 NOT 将导致它 return 为假。

因此,如果它们全为 1 或全为 0,它将 return 为真。

反之则否定

要使其适用于任何值而不仅仅是布尔值,您可以使用按位运算符

bool areDifferent = (bool) ~((b1 & b2 & b3) | ~(b1 | b2 | b3))

在这种情况下,& 语句将产生一个 1,其中该位全为 1。~|语句将提供一个 1,其中该位全为 0。 如果值相同,则对 2 个部分进行 ORing 会给你一个全为 1 的值。 如果值都相同,则否定会给你所有 0(因此逻辑错误)。

这可以通过简单地根据需要输入尽可能多的值来扩展。