您的位置:首页 > 其它

不用if,?:,等判断语句获得两数之中较大的或较小的数

2012-08-27 16:25 232 查看
int getMax(int a,int b){
int num[2]={a,b};
return num[((a>>31 ^ b>>31) & (a>>31 & 1)) | ( !(a>>31 ^ b>>31) & ((a-b)>>31 & 1)) ];
}
int getMin(int a,int b){
int num[2]={b,a};
return num[((a>>31 ^ b>>31) & (a>>31 & 1)) | ( !(a>>31 ^ b>>31) & ((a-b)>>31 & 1)) ];
}
void main()
{
int a=0x7FFFFFFF,b=0xFFFFFFF0;

cout<<getMax(a,b)<<endl;
cout<<getMax(b,a)<<endl;
cout<<getMin(a,b)<<endl;
cout<<getMin(b,a)<<endl;

a=0x7FFFFFFF,b=0xF;
cout<<getMax(a,b)<<endl;
cout<<getMax(b,a)<<endl;
cout<<getMin(a,b)<<endl;
cout<<getMin(b,a)<<endl;

a=0xFFFFFFF0,b=0xFFFFFF00;
cout<<getMax(a,b)<<endl;
cout<<getMax(b,a)<<endl;
cout<<getMin(a,b)<<endl;
cout<<getMin(b,a)<<endl;

a=0xFFFFFFF0,b=0x7FFFFFFF;
cout<<getMax(a,b)<<endl;
cout<<getMax(b,a)<<endl;
cout<<getMin(a,b)<<endl;
cout<<getMin(b,a)<<endl;
}


若a,b异号,即(a>>31 ^ b>>31)为1
则若a>>31 & 1为0,表示a为正,应该返回0,表示a大。若a>>31 & 1为1,表示a为负,应该返回1,表示b大。


若a,b同号,即(a>>31 ^ b>>31)为0

则(a-b)不会溢出,可以通过二者相减的符号位来判断ab大小。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐