通常情况下判断两个数是否异号最直接的方法是
bool cmp(int a, int b)
{
return a*b<0;
}
这种方法其实存在一个潜在问题,如果a*b的值超过了int类型的最大值,就会越界出错,而且是非常有可能发生的一件事
为了减少这个问题发生的可能,要把接收数字的容器换为long long。有没有能从根本上解决这个问题的方法呢?我在网上找到了一种利用位运算的方法
即
bool cmp(int a, int b)
{
return (a^b)<0
}
这种利用位运算的方法巧妙的避免了第一中方法可能会出现的越界问题
但是也存在一个特别大的问题——不能正确的处理0
如果a和b中任意一个数字是0,那么根据异或运算符的特性,结果是另一个数字的值。这意味着另一个数为负数的结果会完全错误
比如在int为16位的机器中,二进制a=1111 0000 0000 0000,b=0,按照第一种方法可以得到正确的返回值false。
而按照位运算的方法会得到结果1111 1111 1111 0000,它对应的十进制小于零,返回值会为true。
要解决这个问题,只需要稍微修改代码即可:
bool cmp(int a, int b)
{
if(a&b)
return (a^b)<0;
else
return false;
}
这样就可以无论怎么样的情况都能正确判断数字是否异号了