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

 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大小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值