Máximo de dos números en C usando operadores bitwise

Posible duplicado:
Encuentra el máximo de dos números sin usar if-else o cualquier otro operador de comparación

es mayor:

if x > y then return 1, else return 0 

Ejemplo:

  • es mayor (4,5) = 0
  • es mayor (5,4) = 1

Operadores legales:! ! ~ & ^ | + <>

Es mayor la función ..

Lo intenté:

 int isGreater(int x, int y) { return (y+(~x+1)) >> 31 & 1; } 

pero no funciona …: ((Déjame saber qué más puedo hacer?

dado x, y

intente x + -y si <0 entonces y es mayor, si> 0 entonces x es mayor.

-y = complemento binario de y:

 -y = (~(y-1)) <==> -y = (~y)+1 

Por lo que veo, haces el complemento binario con (~ y +1)), que es el mismo.

Entonces bitshift >> 31 para obtener el MSB, e igual a 1.
Asegúrese de establecer paréntesis, precedencia del operador!

  (y+-x) >> (31 & 1); != ((y+-x) >> 31) & 1; 

Demasiado fácil: ya que tiene + en la lista de operadores legales, puede sintetizar de forma trivial (como han notado otros) y, por lo tanto, hacer una resta y extraer el signo. Es mucho más interesante si deja de lado + (ya que de todos modos no es un operador bitwise) y responde la pregunta con solo ops bitwise ( & | ^ ~ ) y turnos.

Por supuesto, podría sintetizar + / - partir de operaciones y desplazamientos a nivel de bits, pero en realidad hay una forma más fácil.