什么是一个布尔方程,只有一个变量为真时才是真的?

时间:2013-03-15 06:28:37

标签: boolean

我有4个变量,这是我能做的最好的,但如果有3个真正的变量,它会返回true。

if(a ^ b ^ c ^ d)

3 个答案:

答案 0 :(得分:6)

如果您正在谈论C,其中布尔值只是0/1值,您可以使用:

a + b + c + d == 1

否则,前提是您可以使用&&||

( a && !b && !c && !d) ||
(!a &&  b && !c && !d) ||
(!a && !b &&  c && !d) ||
(!a && !b && !c &&  d)

这简单地将其分解为四种可能的情况,其中每种情况只有一个变量集。

现在你可以用“卡诺”地图“简化”,如下所示(所有空白都是假的):

         AB
          0   0   1   1
          0   1   0   1
        +---+---+---+---+
CD   00 |   | T | T |   |
        +---+---+---+---+
     01 | T |   |   |   |
        +---+---+---+---+
     10 | T |   |   |   |
        +---+---+---+---+
     11 |   |   |   |   |
        +---+---+---+---+

是:

((a ^ b) && !c && !d) || ((c ^ d) && !a && !b)

但是理解(和调试)比上面的简单表达要困难得多,并且实际上并没有那么多,除非你精通布尔代数,DeMorgan的定理,卡诺图等等,坚持第一个


为了表明表达式是等价的,请考虑以下C代码来检查所有可能性:

#include <stdio.h>

int main (void) {
  int a, b, c, d, x, y;

  for (a = 0; a < 2; a++) {
    for (b = 0; b < 2; b++) {
      for (c = 0; c < 2; c++) {
        for (d = 0; d < 2; d++) {
          x =
            ( a && !b && !c && !d) ||
            (!a &&  b && !c && !d) ||
            (!a && !b &&  c && !d) ||
            (!a && !b && !c &&  d);
          y = ((a ^ b) && !c && !d) || ((c ^ d) && !a && !b);
          printf ("%d %d %d %d | %d %d | %s\n",
            a, b, c, d, x, y, (x == y) ? "Okay" : "Bad");
        }
      }
    }
  }
  return 0;
}

这将输出所有16种可能性,表明这两个表达式产生相同的结果:

0 0 0 0 | 0 0 | Okay
0 0 0 1 | 1 1 | Okay
0 0 1 0 | 1 1 | Okay
0 0 1 1 | 0 0 | Okay
0 1 0 0 | 1 1 | Okay
0 1 0 1 | 0 0 | Okay
0 1 1 0 | 0 0 | Okay
0 1 1 1 | 0 0 | Okay
1 0 0 0 | 1 1 | Okay
1 0 0 1 | 0 0 | Okay
1 0 1 0 | 0 0 | Okay
1 0 1 1 | 0 0 | Okay
1 1 0 0 | 0 0 | Okay
1 1 0 1 | 0 0 | Okay
1 1 1 0 | 0 0 | Okay
1 1 1 1 | 0 0 | Okay

答案 1 :(得分:2)

您可以明确地写出您的表达。在长形式中,对于四个布尔变量,它将是(!a && !b && !c && d) || (!a && !b && c && !d) || (!a && b && !c && !d) || (a && !b && !c && !d)

对于任意数量的变量,对于任何任意布尔函数,您可以使用truth table来获取相应的布尔表达式,使用karnaugh map来简化它。

答案 2 :(得分:1)

可能你想尝试使用三元运算符,因为执行时间略短,即使我们考虑上述解决方案的最佳情况。

(a?(b?false:(c?false:(d?false:true))):(b?(c?false:(d?false:true)):(c?(d?false:true):(d?true:false))))