So I see that this question has already been asked, however the answers were a little vague and unhelpful. Okay, I need to implement a c expression using only “& ^ ~ ! + | >> <<“
The expression needs to resemble: a ? b : c
So, from what I’ve been able to tell, the expression needs to look something like:
return (a & b) | (~a & c)
This works when a = 0, because anding it with b will give zero, and then the or expression will return the right side, (~a & c) which works because ~0 gives all ones, and anding c with all ones returns c.
However, this doesn’t work when a > 0. Can someone try to explain why this is, or how to fix it?
I would convert
ato a boolean using!!a, to get 0 or 1.x = !!a.Then I’d negate that in two’s complement. Since you don’t have unary minus available, you use the definition of 2’s complement negation: invert the bits, then add one:
y = ~x + 1. That will give either all bits clear, or all bits set.Then I’d
andthat directly with one variabley & b, its inverse with the other:~y & c. That will give a 0 for one of the expressions, and the original variable for the other. When weorthose together, the zero will have no effect, so we’ll get the original variable, unchanged.