2

私は4つの変数を持っていますが、これは私ができる最善のことでしたが、3つの真の変数がある場合は真を返します。

もし(a ^ b ^ c ^ d)

4

3 に答える 3

6

ブール値が単なる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
于 2013-03-15T06:40:11.453 に答える
2

式を明示的に書き出すことができます。長い形式では、4 つのブール変数の場合、次のようになります。(!a && !b && !c && d) || (!a && !b && c && !d) || (!a && b && !c && !d) || (a && !b && !c && !d)

任意の数の変数について、任意のブール関数について、真理値表を使用して適切なブール式を取得し、カルノー マップを使用してそれを簡略化できます。

于 2013-03-15T06:31:13.903 に答える
1

上記のソリューションの最良のシナリオを検討した場合でも、実行時間はわずかに短いため、三項演算子を試してみてください。

(a?(b?false:(c?false:(d?false:true))):(b?(c?false:(d?false:true)):(c?(d?false:true):(d?true:false))))
于 2013-03-15T07:16:52.563 に答える