如何不用比較符號比較2個數的大小
阿新 • • 發佈:2019-01-01
- 方法一
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;
}