The trick involves using x >> 31 as a mask with the bitwise and: &.
(x >> 31) is 0 if x >= 0
(x >> 31) is 0xFFFFFFFF if x >= 0
We can use this to add 1 to x >> 1 only when x is odd and negative.
Here is the solution using only the allowed bit operators.
/**
* Computes x / 2 (integer division)
* Examples: div2( 6,2) = 3
* div2( 5,2) = 2
* div2(-6,2) = -3
* div2(-5,2) = -2
* Restrictions: Use only int constants that fit in 1 byte
* Use only << >> & +
* Max operators: 12
*/
int div2(int x)
{
int xs = x >> 31; /* 0 if x >= 0 and 0xFFFFFFFF if x < 0 */
int y = x >> 1; /* x / 2 if x is >= 0 or if x is even */
int z = x & 1; /* 1 if x is odd; otherwise 0 */
return (xs & (y + z)) + (~xs & y);
/* return 2; */
}