私は4つの変数を持っていますが、これは私ができる最善のことでしたが、3つの真の変数がある場合は真を返します。
もし(a ^ b ^ c ^ d)
ブール値が単なる0/1
値であるCについて話している場合は、次を使用できます。
a + b + c + d == 1
それ以外の場合は、&&
andを使用できる場合||
:
( a && !b && !c && !d) ||
(!a && b && !c && !d) ||
(!a && !b && c && !d) ||
(!a && !b && !c && d)
これは単純に、それぞれが 1 つの変数セットしか持たない 4 つのケースに分類されます。
これで、次のように Karnaugh マップを使用して「単純化」できます (すべての空白は false です)。
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 の可能性すべてを出力し、2 つの式が同じ結果を生成することを示しています。
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
上記のソリューションの最良のシナリオを検討した場合でも、実行時間はわずかに短いため、三項演算子を試してみてください。
(a?(b?false:(c?false:(d?false:true))):(b?(c?false:(d?false:true)):(c?(d?false:true):(d?true:false))))