XOR of three values
bool result = (a?1:0)+(b?1:0)+(c?1:0) == 1;
Another possibility:
a ? !b && !c : b ^ c
which happens to be 9 characters shorter than the accepted answer :)
a^b^c
is only 1 if an uneven number of variables is 1 (two '1' would cancel each other out). So you just need to check for the case "all three are 1":
result = (a^b^c) && !(a&&b&&c)
For exactly three terms, you can use this expression:
(a ^ b ^ c) && !(a && b && c)
The first part is true
iff one or three of the terms are true
. The second part of the expression ensures that not all three are true
.
Note that the above expression does NOT generalize to more terms. A more general solution is to actually count how many terms are true
, so something like this:
int trueCount =
(a ? 1 : 0) +
(b ? 1 : 0) +
(c ? 1 : 0) +
... // more terms as necessary
return (trueCount == 1); // or some range check expression etc