问题:写一个函数,判断给定的两个数字是否是符号相反的,不可以使用比较运算符。
例如 fun(-1, 100) == true; fun(5,6)=false; fun(-1,-2)=false; 同时,规定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。