In this problem, b will be either 0 or 1. If we multiply x * b, we will have:
x * b = x if b = 1
x * b = 0 if b = 0
Similary for y:
y * b = y if b = 1
y * b = 0 if b = 0
We need something that allows us to have:
x * f(b) = x if b = 1
y * f'(b) = 0 if b = 1
And:
x * f(b) = 0 if b = 0
y * f'(b) = y if b = 0
If we have this, we can just return x + y
or x | y
since one of them will always be 0.
From the following equation:
x * f(b) = x if b = 1
x * f(b) = 0 if b = 0
Clearly f(b) = b
. From the following equation:
y * f'(b) = 0 if b = 1
y * f'(b) = y if b = 0
We need to, somehow, "invert" the result from f(b)
(we need f'(b
) to be the opposite of f(b)
). We can use a simple bit manipulator to achieve this.
Considering the possibles binary values of b
:
b = 0 -> ...0000 0000
b = 1 -> ...0000 0001
If we sum 1 to b, we get:
b = 1 -> ...0000 0001
b = 2 -> ...0000 0010
Note that, for b = 2
, there is an extra 1 we want to get rid of, If we use the and bitwase operator, we can get rid of it:
1 & 1 = 1
...0000 0001
...0000 0001
------------
...0000 0001
2 & 1 = 0
...0000 0010
...0000 0001
------------
...0000 0000
Therefore, to get 1
when b = 0
and 0
when b = 1
:
f'(b) = (f(b) + 1) & 1
The final formula will be:
b2 = (b + 1) & 1
x2 = x * b
y2 = y * b2
result = x2 + y2 // or x2 | y2