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

670





