ビット演算による整数の正負の判断


面白い問題:整数を与えて、その正負を判断して、正数は1を返して、複素は-1を返して、0は0を返します.ビット演算子とプラス記号のみで、ループ判定などの制御文は使用できないことが要求されます.
考えたコードは再帰的なものに似ていて、まだ愚かな感じがします.
int sign(int x) {
  //Right move 31 bits, if x is non-negative, then a=0x00000000
  //if x is negative, then a = 0xFFFFFFFF
  //Treat the first bit and the rest differently
  //recursively determine if the value part is 0 or not
  int a = x >> 31;
  int b = (x & 0x0000FFFF)|(x >> 16 & 0x0000FFFF);
  b = (b & 0x000000FF) | (b >> 8 & 0x000000FF);
  b = (b & 0x0000000F) | (b >> 4 & 0x0000000F);
  b = (b & 0x00000003) | (b >> 2 & 0x00000003);
  b = (b & 0x00000001) | (b >> 1 & 0x00000001);
  
  return a|b;
}

However、この問題は最大10個以上の演算子を使用することができず、使用する定数は255を超えることができないため、間違っています.
実は、31ビット右にシフトすると、負数か非負数かが判断できます.そのため、元の数を逆にすれば、0かどうかがわかります.
  return (x >> 31) | (~((~x + 1) >> 31) + 1);

これでいい