【解决思路】
两个数相减,得到其符号,利用其符号可以知道哪个大。但对于两个不同符号的数,相减可能会溢出,所以我们需要判断一下两个数的符号。判断数的符号用到位运算。所以先介绍一下位运算。
【位运算】
位运算符(左结合律)
左移运算符(<<)在右侧插入值为的二进制位。右移运算符(>>)的行为则依赖于其左侧运算对象的类型:如果该运算对象是无符号类型,在左侧插入值为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