- 方法一
int flip(int a)
{
return a^1;
}
int sign(int a)
{
//正数和0返回1,负数返回0
reiturn ((a>>31)+1);
}
int getmax(int a,int b)
{
int c = a-b;
int signa = sign(c);
int signb = flip(b);
return a*signa+b*signb;
}
方法一适用于大部分情况,但是当a-b的值溢出时,这种不能获得最大值,所以,请看下面的方法二:
- 方法二
#include <iostream>
using namespace std;
class Compare
{
public:
Compare(int a,int b)
{
a_ = a;
b_ = b;
}
int flip(int a)
{
return a^1;
}
int sign(int a)
{
//正数和0返回1,负数返回0
return ((a>>31)+1);
}
int getmax(int a,int b)
{
int c = a-b;
int signa = sign(a);
int signb = sign(b);
int signc = sign(c);
int diffab = signa^signb;
int sameab = flip(diffab);
int returna = diffab*signa+sameab*signc;
int returnb = flip(returna);
//a与b不同符号
//a+b-,diffab=1,sameab=0,return a
//a-b+,diffab=1,sameab=0,return b
//a与b相同符号:
//a+b+,diffab=0,sameab=1,a>b,return a
//a-b-,diffab=0,sameab=1,a<b,return b
return returna*a+returnb*b;
}
private:
int a_;
int b_;
};
int main(void)
{
Compare compare(5,2);
int result = compare.getmax(5,2);
cout << "result="<<result<<endl;
return 0;
}