判断整数的正负零特性

判断整数的正负零特性
   原为某软件公司试题,大意如下:对于给定的有符号32位整数,写一个函数,当该数为正数时返回1,为负数时返回-1,为零时返回零, 要求不能使用任何的条件判断分支跳转语句 。在这里,稍微扩展了一下,给出了对应无符号32位整数的情形。解决思路是符号位和值分开处理,对于有符号32位整数, 符号位右移31位即 得a, 若为非负数 则a=0x00000000, 否则a= 0xFFFFFFFF;然后 将值部分各位的值(0或1 不断缩小 合并到一位中去得到b ,这 是针对0和正数的情况处理, 再将a和b位 即可 。C++代码 描述如下
 1 // 若val为0则返回0, val为负数则返回-1, 为正数返回1
 2 int32_t  check32( int32_t  val)
 3 {
 4    int32_t a = val >> 31;
 5    int32_t b = (val & 0x0000FFFF| ((val >> 16)&0x0000FFFF);
 6    b = (b & 0x000000FF| ((b >> 8)&0x000000FF);
 7    b = (b & 0x0000000F| ((b >> 4)&0x0000000F);
 8    b = (b & 0x00000003| ((b >> 2)&0x00000003);
 9    b = (b & 0x00000001| ((b >> 1)&0x00000001);
10   return a|b;
11}

12
13 // 若val为0则返回0, 否则返回1
14 uint32_t  check32( uint32_t  val)
15 {
16    uint32_t a = (val & 0x0000FFFF| ((val >> 16)&0x0000FFFF);
17    a = (a & 0x000000FF| ((a >> 8)&0x000000FF);
18    a = (a & 0x0000000F| ((a >> 4)&0x0000000F);
19    a = (a & 0x00000003| ((a >> 2)&0x00000003);
20    a = (a & 0x00000001| ((a >> 1)&0x00000001);
21    return a;
22}
   若哪位有更好的解法,还望多多分享

你可能感兴趣的:(判断整数的正负零特性)