如果你在说C,布尔值只是0/1值,你可以使用:
a + b + c + d == 1
Run Code Online (Sandbox Code Playgroud)
否则,只要您可以使用&&和||:
( a && !b && !c && !d) ||
(!a && b && !c && !d) ||
(!a && !b && c && !d) ||
(!a && !b && !c && d)
Run Code Online (Sandbox Code Playgroud)
这简单地将其分解为四种可能的情况,其中每种情况只有一个变量集.
现在你可以用"卡诺"地图"简化"它,如下所示(所有空格都是假的):
AB
0 0 1 1
0 1 0 1
+---+---+---+---+
CD 00 | | T | T | |
+---+---+---+---+
01 | T | | | |
+---+---+---+---+
10 | T | | | |
+---+---+---+---+
11 | | | | |
+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)
成为:
((a ^ b) && !c && !d) || ((c ^ d) && !a && !b)
Run Code Online (Sandbox Code Playgroud)
但是理解(和调试)比上面更简单的表达要困难得多,并且实际上并没有那么多,除非你精通布尔代数,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;
}
Run Code Online (Sandbox Code Playgroud)
这将输出所有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
Run Code Online (Sandbox Code Playgroud)