三个值的XOR

Jos*_*osh 34 language-agnostic logic boolean xor boolean-expression

进行三向异或的最简单方法是什么?

换句话说,我有三个值,我想结果为true IFF只声明一个三个值是真实的.

到目前为止,这是我提出的:

((a ^ b)&&(a ^ c)&&!(b && c))|| ((b ^ a)&&(b ^ c)&&!(a && c))|| ((c ^ a)&&(c ^ b)&&!(a && b))

是否有更简单的事情做同样的事情?


以下是上述完成任务的证明:

a = true; b = true; c = true
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> false

a = true; b = true; c = false
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> false

a = true; b = false; c = true
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> false

a = true; b = false; c = false
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> true

a = false; b = true; c = true
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> false

a = false; b = true; c = false
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> true

a = false; b = false; c = true
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> true

a = false; b = false; c = false
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> false
Run Code Online (Sandbox Code Playgroud)

pol*_*nts 43

对于三个术语,您可以使用以下表达式:

(a ^ b ^ c) && !(a && b && c)
Run Code Online (Sandbox Code Playgroud)

第一部分是trueiff中的一个或三个true.表达式的第二部分确保不是所有三个都是true.

请注意,上述表达式并未概括为更多术语.更通用的解决方案是实际计算有多少项true,所以这样的事情:

int trueCount =
   (a ? 1 : 0) +
   (b ? 1 : 0) +
   (c ? 1 : 0) +
   ... // more terms as necessary 

return (trueCount == 1); // or some range check expression etc
Run Code Online (Sandbox Code Playgroud)

  • `一个?1 : 0` 可以简化为 `!!a` (2认同)
  • @ gg.kaspersky,仅在JavaScript,C和通过`!`运算符进行真实/错误测试的语言中使用。例如,这在Java或C#中不起作用。 (2认同)

Hem*_*ant 13

bool result = (a?1:0)+(b?1:0)+(c?1:0) == 1;
Run Code Online (Sandbox Code Playgroud)


Aar*_*lla 9

a^b^c如果变量的数量不均匀为1(两个'1'将相互抵消),则仅为1.所以你只需要检查"三个都是1"的情况:

result = (a^b^c) && !(a&&b&&c)
Run Code Online (Sandbox Code Playgroud)


Tim*_*mwi 6

另一种可能性

a ? !b && !c : b ^ c
Run Code Online (Sandbox Code Playgroud)

恰好比接受的答案短9个字符:)