This does not implement XOR. Try substituting b1<-0, b2<-0
You can also see it in the xor karnaugh map which cannot be simplified
simplest way is to use bitwise ^ or (!b1&&b2)||(b1&&!b2)
cheers!
Printable View
If we use the rules from C: (!(-1) ^ !(-2)) = (0 ^ 0) = 0. This is correct.Quote:
Originally Posted by juncode
I do not see how that matters here since the proposed alternative expression is not a simplification.Quote:
Originally Posted by juncode
It was already pointed out that this would not work in general, back in post #4, some 12 years ago.Quote:
Originally Posted by juncode
Of course. I confused ^ with &&. Clearly !bn gives a result of type bool, which can be then correctly used with bitwise xor ^.
Sorry and thanks for pointing that out!
It depends how you define 'correctly'
the result of 2 bools being bitwise xor'ed is an int. if you expect the result being of type bool, then you may not be getting the result you want. the "correctest" approach for logical xor behaviour is really using a != operator.
with != either of the 2 operators is evaluated exactly once, and the result is a bool.
Using a != will probably also better convey what the code is supposed to do, making it more readable. The only exception I can think of to this is probably trying to actually model logic gates in a circuit.
I'm curious as to whether ...
if ((a == b) != (c == d))
is equivalent to:
if ((a == b) ^^ (c == d))
were the '^^' operator to exist (i.e. the elusive exclusive or operator is just '!=')?
For logical bool != we have the truth table
0 0 -> 0
1 0 -> 1
0 1 -> 1
1 1 -> 0
This is indeed the logical exclusive or (^^ as defined above in post #20)
So in this case, (a == b) != (c ==d)
would give the same logical bool result as (a == b) ^^ (c == d) if ^^ was defined as the logical bool exclusive or.
Note that in this case, the operator ^^ is operating on 2 bools so in this case the bitwise exclusive or (^) would produce the same result
so (a== b) != (c == d)
gives the same result as
(a==b) ^ (c==d)
Note this is only true when the 2 values being compared with != are bool. For any other type ^ is not equal to !=.
Thanks for your reply 2kaud ...
You are correct and also pointing out this was implied in post 20 - I did not intend to plagiarise - I just stumbled on this thread after working it out (and trying it out) for myself.
I guess the key point (answering your last) is that &&, ||, etc. are logical operators intended for use with Boolean variables anyway ...
So the answer to the post in it's simplest form:
"Logical XOR in C/C++?" is...
Yes it's '!='.
... furthermore '==' is a Logical XNOR.
:)