Personnellement, je pense qu'il est au contraire trivial de répondre à une telle question.
En C, je ne vois pas pourquoi le second code serait correct déjà. Et puis de toute façon, c'est le boulot du compilateur de transformer la première version en quelque chose d'efficace sur l'architecture cible. D'ailleurs, ce qui me vient en tête c'est plutôt :
sgn(n):
return (n & (0x80000000) >> 30) + 1
(code à ajuster en fonction de la taille des entiers) si n est entier, et
sgn(n):
return (n & 0x8000000000000000) | 0x7ff0000000000000
si n est un double.
PS: Ne pas utiliser le premier code tel quel en C, ça ne marchera sans doute pas à cause du >> qui risque de ne pas être traduit en un shift arithmetique. Quant au deuxième code, il faudra abuser du cast (et passer par du unsigned long*) pour le faire marcher correctement en C.
PPS: "(formulations en pseudocode) "
non, formulation en python (modulo l'omission de def) 