不用if等判断语句找出两个数中间较大的那个?

【解决思路】

两个数相减,得到其符号,利用其符号可以知道哪个大。但对于两个不同符号的数,相减可能会溢出,所以我们需要判断一下两个数的符号。判断数的符号用到位运算。所以先介绍一下位运算。

【位运算】

位运算符(左结合律)
位运算符(左结合律)
左移运算符(<<)在右侧插入值为的二进制位。右移运算符(>>)的行为则依赖于其左侧运算对象的类型:如果该运算对象是无符号类型,在左侧插入值为0的二进制位;如果该运算对象是带符号类型,在左侧插入符号位的副本或值为0的二进制位。

【实现代码】

//检测正负数符号,正数为1,负数为0
int sign(int n)
{
	return (n >> 31 & 1) ^ 1;
}
//判断大小
int getmax(int a, int b)
{
	int sa = sign(a);   //取a符号
	int sb = sign(b);   //取b符号
	int sc = sign(a - b);  //取ab差值的符号
	int difSab = sa ^ sb;  
	int sameSab = difSab ^ 1;
	int returnA = sa * difSab + sc * sameSab;
	int returnB = returnA ^ 1;
	return a * returnA + b * returnB;
}

其中sign函数的功能是返回整数n的符号,正数和0则返回1,负数返回0(在二进制表达中符号位0表示正,1表示负,注意不要搞混)。
如果a和b的符号不同(difSab = 1, sameSab = 0),则有:

  • 如果a为0或正,那么b为负(sa = 1, sb = 0),应该返回a
  • 如果b为0或正,那么a为负(sb = 1, sa = 0),应该返回b

如果a和b的符号相同(difSab = 0, sameSab = 0),此时一定不会发生溢出:

  • 如果a - b为0或者为正(sc = 1),返回a
  • 如果a - b为负(sc = 0 ),返回b

参考文章链接:https://blog.youkuaiyun.com/qq_34342154/article/details/77871202

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值