あなたの例ではおそらく実用的な価値はありませんが、実際にはブール論理のみを使用してこれを達成できます。ブール値のバージョンは、単に真の値の数を数えるよりもはるかに複雑です。
とにかく、知的好奇心を満たすために、ここに行きます。まず、一連の XOR を使用するというアイデアは優れていますが、道半ばです。任意の 2 つの変数xとyについて、
x⊻y _ _
それらの 1 つだけが true の場合は常に true です。ただし、3 番目の変数zを追加すると、これは当てはまりません。
x ⊻ y ⊻ z
最初の部分x ⊻ yは、 xとyのいずれかが真である場合でも真です。xまたはyのいずれかが true の場合、式全体が true になるにはzが false である必要があります。これが必要です。しかし、 xとyの両方が true の場合はどうなるか考えてみてください。x ⊻ yは false ですが、 zもtrue の場合、式全体が true になる可能性があります。したがって、1 つの変数または 3 つすべてが true でなければなりません。一般に、XOR のチェーンであるステートメントがある場合、奇数の変数が true である場合に true になります。
1 は奇数なので、これは役に立つかもしれません。もちろん、奇数の真理をチェックするだけでは十分ではありません。さらに、真の変数が 1 つだけであることを確認する必要があります。これは、2 つの変数のすべてのペアを取得し、それらが両方とも真ではないことを確認することにより、ペアごとに行うことができます。これら 2 つの条件を組み合わせると、変数が true の場合に 1 つだけが保証されます。
以下は、アプローチを説明するための小さな Python スクリプトです。
from itertools import product
print("x|y|z|only_one_is_true")
print("======================")
for x, y, z in product([True, False], repeat=3):
uneven_number_is_true = x ^ y ^ z
max_one_is_true = (not (x and y)) and (not (x and z)) and (not (y and z))
only_one_is_true = uneven_number_is_true and max_one_is_true
print(int(x), int(y), int(z), only_one_is_true)
そして、これが出力です。
x|y|z|only_one_is_true
======================
1 1 1 偽
1 1 0 偽
1 0 1 偽
1 0 0 真
0 1 1 偽
0 1 0 真
0 0 1 真
0 0 0 偽