boolean-logic - 布尔运算ppt - 布尔运算规则




逻辑来测试3的4是真的 (18)

当且仅当4个布尔值中的3个为True时,我才想返回True

我得到的最接近的是(x ^ y) ^ (a ^ b)

我该怎么办?


当且仅当4个布尔值中的3个为真时,我才想返回true。

给定4个布尔值a,b,x,y,这个任务转化为下面的C语句:

return (a+b+x+y) == 3;

Java 8,过滤出错误的值,并计算剩余的真值:

public static long count(Boolean... values) {
    return Arrays.stream(values).filter(t -> t).count();
}

那么你可以使用它如下:

if (3 == count(a, b, c, d)) {
    System.out.println("There... are... THREE... lights!");
}

很容易概括为检查m项目是否为真。



以下是您可以使用LINQ在C#中解决的一种方法:

bool threeTrue = new[] { a, b, x, y }.Count(x => x) == 3;

在PHP中,使其更具动态性(以防万一您更改条件数量等):

$min = 6;
$total = 10;

// create our boolean array values
$arr = array_map(function($a){return mt_rand(0,1)>0;},range(1,$total));

// the 'check'
$arrbools = array_map(function($a){return (int)$a;},$arr);
$conditionMet = array_sum($arrbools)>=$min;

echo $conditionMet ? "Passed" : "Failed";

如果你想在编程语言中使用这个逻辑,我的建议是

bool test(bool a, bool b, bool c, bool d){
    int n1 = a ? 1 : 0;
    int n2 = b ? 1 : 0;
    int n3 = c ? 1 : 0;
    int n4 = d ? 1 : 0;

    return n1 + n2 + n3 + n4 == 3;
}

或者如果你愿意,你可以把所有这些放在一行中:

return (a ? 1 : 0) + (b ? 1 : 0) + (C ? 1 : 0) + (d ? 1 : 0) == 3;

你也可以把这个问题概括n of m

bool test(bool *values, int n, int m){
    int sum = 0;
    for(int i = 0; i < m; i += 1){
        sum += values[i] ? 1 : 0;
    }
    return sum == n;
}

如果您使用纸上(非编程)解决方案,那么K-maps和Quine-McCluskey算法就是您所追求的,它们可以帮助您缩小布尔函数。

在你的情况下,结果是

y = (x̄3 ^ x2 ^ x1 ^ x0) ∨ (x3 ^ x̄2 ^ x1 ^ x0) ∨ (x3 ^ x2 ^ x̄1 ^ x0) ∨ (x3 ^ x2 ^ x1 ^ x̄0)

如果你想以编程的方式,非固定数量的变量和一个自定义的“阈值”,然后简单地遍历一个布尔值列表并计算“true”的出现次数,那么它非常简单直接。


如果这是Python,我会写

if [a, b, c, d].count(True) == 3:

要么

if [a, b, c, d].count(False) == 1:

要么

if [a, b, c, d].count(False) == True:
# In Python True == 1 and False == 0

要么

print [a, b, c, d].count(0) == 1

要么

print [a, b, c, d].count(1) == 3

要么

if a + b + c + d == 3:

要么

if sum([a, b, c, d]) == 3:

所有这些工作,因为布尔人是Python中的整数的子类。

if len(filter(bool, [a, b, c, d])) == 3:

或者,受这个巧妙的窍门启发,

data = iter([a, b, c, d])
if not all(data) and all(data):

我建议以代表你的意思的方式编写代码。 如果你想要3个值是真的,我觉得值3出现在某个地方似乎很自然。

例如,在C++

if ((int)a + (int)b + (int)c + (int)d == 3)
    ...

这在C++有很好的定义: standard (§4.7/4)表示将bool转换为int给出期望值0或1。

在Java和C#中,您可以使用以下结构:

if ((a?1:0) + (b?1:0) + (c?1:0) + (d?1:0) == 3)
    ...


由于可读性是一个大问题,您可以使用描述性函数调用(包装任何建议的实现)。 如果这个计算需要在多个地方完成,函数调用是实现重用的最佳方式,并且清楚地说明了你在做什么。

bool exactly_three_true_from(bool cond1, bool cond2, bool cond3, bool cond4)
{
    //...
}

类似于第一个答案,但纯Java:

int t(boolean b) {
    return (b) ? 1 : 0;
}

if (t(x) + t(y) + t(a) + t(b) == 3) return true;
return false;

我更喜欢把它们作为整数来计数,因为它使得代码更具可读性。


请记住,如果对于编程问题,而不仅仅是逻辑问题,答案显然取决于编程语言的选择。 有些语言支持其他人不常见的功能。

例如,在C ++中,您可以使用以下条件测试您的条件:

(a + b + c + d) == 3

这应该是检查支持从布尔型到整型自动(低级别)转换的语言的最快方式。 但是,再次,这个问题没有普遍的答案。


这个答案取决于表示的系统,但是如果0是唯一被解释为false的值,而not(false)总是返回相同的数值,那么not(a) + not(b) + not(c) + not(d) = not(0)应该做的伎俩。


这里是我刚写的一些c#代码,因为你激励了我:

它需要任何数量的参数,并会告诉你它们中的n是否为真。

    static bool boolTester(int n, params bool[] values)
    {
        int sum = 0;           

        for (int i = 0; i < values.Length; i++)
        {
            if (values[i] == true)
            {
                sum += 1;
            }                
        }
        if( sum == n)
        {
            return true;
        }            
        return false;                
    }

你这样称呼它:

        bool a = true;
        bool b = true;
        bool c = true;
        bool d = false;            

        bool test = false;
        test = boolTester(3, a, b, c, d);

所以你现在可以按照你的意愿测试7/9或15/100。


这里有很多很好的答案; 这是另一个没有其他人发布的公式:

 a ? (b ? (c ^ d) : (c && d)) : (b && c && d)

((a xor b) xor (c xor d)) and ((a or b) and (c or d))

第一个表达式搜索1或3个true ''。第二个消除了0或1(有时2个) true的4个。


((a^b)^(x^y))&((a|b)&(x|y))

是你想要的。 基本上我拿你的代码,并添加检查,如果实际上3是真实的,而不是3是错误的。