//非负数返回1,负数返回0
int sign(int n){
//先获得符号位再反转
return (flip(n>>31&1));
}
//使用flip函数时需要保证输入只能为1或0
int flip(int n){
return n^1;
}
有了以上两个操作之后,我们用它来解决一些问题。 求两个数的最大值但是不能使用比较
int GetMax(int a,int b){
int c=a-b;
//如果c>0,那么scA=1;如果c<0,scA=0
int scA=sign(c);
//进行反转
int scB=flip(scA);
//至此,scA和scB是互斥的。
return scA*a+scB*B;
}
但是这种方法a-b有可能会溢出。下面是一种不溢出的方法。
int GetMax(int a,int b){
int c=a-b;
int scA=sign(a);
int scB=sign(b);
int scC=sign(c);
//相同为0,不同为1
int diff=scA^scB;
int same=flip(diff);
//如果最大值为a,那么如果 a、b符号相同,a-b一定不会溢出
//a-b>=0时最大值就为a,那么就需要看c的符号
//如果a、b符号不同,如果a>0,那么就可以返回a
int returnA=diff*scA+same*scC;
//返回a和返回b的条件肯定是互斥的
int returnB=flip(returnA);
return returnA*a+returnB*b;
}