利用位运算判断整数的正负

挺有趣的题:给定一个整数,判断其正负,正数返回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);

这样就可以了

你可能感兴趣的:(位运算,C)