首页 > 剑指offer > 判断两个数是否符号相反-[位运算]
2014
05-05

判断两个数是否符号相反-[位运算]

写一个函数,判断给定的两个数字是否是符号相反的,不可以使用比较运算符。

例如 fun(-1, 100) == true;  fun(5,6)=false;  fun(-1,-2)=false; 同时,规定0属于正数。

如果使用比较运算符的话:

bool oppositeSigns(int x, int y)
{
    return (x < 0)? (y >= 0): (y < 0);
}

在二进制表示中,最高位是1的话,就是负数。最高位为0则为正数。因此我可以想办法通过位运算来判断。1 ^0 = 1。所以 负数^正数=负数。其实就是类似于乘法了。

#include<stdbool.h>
#include<stdio.h>

bool oppositeSigns(int x, int y)
{
    return ((x ^ y) < 0);
}

int main()
{
    int x = 100, y = -100;
    if (oppositeSigns(x, y) == true)
       printf ("Signs are opposite");
    else
      printf ("Signs are not opposite");
    return 0;
}

但是,这里用到了比较运算符。其实完全可以把  <0 的比较去掉,因为我们只需要知道第一位符号位即可。

bool oppositeSigns(int x, int y)
{
    return ((x ^ y) >> 31);
}

右移31位,则只剩下最高位符号位,不是0,就是1。