版权声明:本文采用 知识共享署名4.0 国际许可协议进行许可。 https://blog.csdn.net/youmian6868/article/details/85264627
题目
给定两个32位整数a和b,返回a和b中较大的。不能用任何比较判断。
代码实现
/**
* n为1,返回0;n为0,返回1
*
* @param n
* @return
*/
public int flip(int n) {
return n ^ 1;
}
/**
* 正数和0返回1,负数返回0
*
* @param n
* @return 整数n的符号
*/
public int sign(int n) {
return flip((n >> 31) & 1);
}
//可能会溢出,返回结果就不正确
public int getMax1(int a, int b) {
int c = a - b;
int scA = sign(c);
int scB = flip(scA);
return a * scA + b * scB;
}
//解决溢出问题
public int getMax2(int a, int b) {
int sa = sign(a);
int sb = sign(b);
int sc = sign(a - b);
int difSab = sa ^ sb;
int sameSab = flip(difSab);
int returnA = difSab * sa + sameSab * sc;
int returnB = flip(returnA);
return a * returnA + b * returnB;
}