三个值的异或

问题描述 投票:0回答:10

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

换句话说,我有三个值,并且我想要一个仅当三个值中的一个为真时才计算为真 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
language-agnostic logic boolean xor boolean-expression
10个回答
53
投票

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

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

第一部分是

true
,当且仅当其中一个或三个术语是
true
。表达式的第二部分确保三个部分并非全部
true

请注意,上述表达式NOT不能推广到更多术语。更通用的解决方案是实际计数有多少项

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

20
投票
bool result = (a?1:0)+(b?1:0)+(c?1:0) == 1;

9
投票
如果变量个数为 1 时为奇数,则

a^b^c
仅为 1(两个“1”会相互抵消)。所以你只需要检查“所有三个都是 1”的情况:

result = (a^b^c) && !(a&&b&&c)

9
投票

另一种可能性:

a ? !b && !c : b ^ c

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


3
投票

在 Python 上更好:

result = (1 if a else 0)+(1 if b else 0)+(1 if c else 0) == 1

这也可以用于 if 语句!

它通过 Click 为 CLI 互斥参数节省了时间(每个人都讨厌点击)


2
投票

你也可以尝试(C语言):

!!a + !!b + !!c == 1


1
投票

这是一种一般实现,当发现多个

bool
true
时,该实现很快就会失败。

用法

XOR(a, b, c);

代码

public static bool XOR(params bool[] bools)
{
    return bools.Where(b => b).AssertCount(1);
}

public static bool AssertCount<T>(this IEnumerable<T> source, int countToAssert)
{
    int count = 0;
    foreach (var t in source)
    {
        if (++count > countToAssert) return false;
    }

    return count == countToAssert;
}

1
投票
f= lambda{ |a| [false, false, true].permutation.to_a.uniq.include? a }
p f.call([false, true, false])
p f.call([false, true, true])

$ 正确

$假

因为我可以。


0
投票

在C中:

#include <stdbool.h>

bool array_xor(size_t array_size, bool[] array) {
    int count = 0;

    for (int i = 0; i < array_size && count < 2; i++) {
        if (array[i]) {
            count++;
        }
    }

    return count == 1;
}

0
投票

结果 = ( BOOL_TO_INT(一) + BOOL_TO_INT (b) + BOOL_TO_INT (c) ) = 1

© www.soinside.com 2019 - 2024. All rights reserved.