三个值的异或运算

6
我有三个布尔值。如果这三个值都是true或者都是false,我需要返回false。在其他情况下,我将返回true。根据我的研究,在一些规范中,这被称为三变量的异或运算。

编辑:一些规范声称三变量的异或运算仅在只有一个参数为true的情况下才会产生true结果。我在这里所指的异或运算属于另一种规范,其中可以有多个值为true,但不是全部。

  • 执行此操作的最快方法是什么?a xor b xor c不起作用

  • 如果不是三个而是n个参数呢?

这是我想要的操作(三个参数的异或)的真值表。

A   B   C   -
T   T   T   F
T   T   F   T
T   F   T   T
T   F   F   T
F   T   T   T
F   T   F   T
F   F   T   T
F   F   F   F

1
可能是XOR of three values的重复问题。 - subdeveloper
很遗憾,不是这样的。我编辑了我的问题以进一步解释原因。在那个问题中,他问道:“我想要一个语句,当且仅当三个值中只有一个为真时才评估为真。”这与我的问题不同。 - Hatefiend
4个回答

7
要为此编写算法,您需要知道如何在三个变量中使用卡诺图。请参阅此处的示例卡诺图here
好的。首先,为了简化事情,请将T替换为 1 ,F替换为 0
乍一看,它只是一个递增的3位二进制数。因此,按递增方式排列它是一个好主意。请看下面。
A   B   C       F(A,B,C)
0   0   0       0
0   0   1       1
0   1   0       1
0   1   1       1
1   0   0       1
1   0   1       1
1   1   0       1
1   1   1       0

使用卡诺图,您将得到以下布尔表达式。对于第一个表达式,我们得到A'B

see image 1

对于第二个表达式AB'

see image 2

对于第三个表达式B'C

see image 3

对于第四个表达式BC'

enter image description here

简单理解卡诺图,如果所有的1都在变量表格的直线视野内,则表达式中的一个项仅包含该变量。但是,如果1在该变量的直线视野之外,则它是该变量的补集。
F(A,B,C) = A'B + AB'+ B'C + BC'

但是自从

A XOR B = AB'+ A'B
B XOR C = BC'+ B'C

那么我们简化后的表单将是:

F(A,B,C) = A XOR B + B XOR C

对于伪代码编程而言,它相当于

result = (A XOR B) OR (B XOR C)
//other else
result = (A ^ B) | (B ^ C)

哇,好棒的阅读。你能解释一下你是如何从3位二进制步骤到F(A,B,C) = A'B + AB'+ B'C步骤的吗? - Hatefiend
抱歉,我忘记了 BC。应该是 F(A,B,C) = A'B + AB' + B'C + BC'。 - Leandro Keen Zapa
谢谢。在这个步骤中:A XOR B = AB'+ A'B+代表的是OR吗? - Hatefiend
@Hatefield 是的,你说得对。就像乘法是AND,加法是OR一样,但它们的意思不同。这在布尔表达式分析中经常使用。 - Leandro Keen Zapa

4

使用以下方式:

(A XOR B) OR (B XOR C)

同样适用于 n 个输入:

(A XOR B) OR (B XOR C) OR ...(n XOR n+1)


谢谢。我和朋友刚刚几分钟前找到了这个答案。很高兴它是正确的。 - Hatefiend
很高兴你把最佳答案改成了Leandro的回答,他的回答更加详细。 - subdeveloper

1
这是我实现它的 Python 代码。
def xor_three(a, b, c):
    return (a ^ b) or (b ^ c)

A = True
B = False
C = True

print(xor_three(A, B, C))

0
如果三个条件全部为真或全部为假,我认为最好的方法是:
if (a AND b AND c) or (not a AND not b AND not c):
    # Do something

如果你只想在一个值为真时返回 true:

if int(a) + int(b) + int(c) == 1:
    # Do something

非常感谢!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接