【题目】给定两个32位整数a和b,返回a和b中较大的。
【要求】不用任何比较。
public class GetMaxAB {
// n = 0 就返回1, n = 1就返回0.
public static int isZeroOrOne(int n) {
return n ^ 1;
}
// 判断n是负数还是正数,正数和0返回1,负数返回0。
public static int isNegOrPos(int n) {
return (n << 31) & 1;
}
// 如果a - b的值溢出,结果不正确
public static int getMax1(int a, int b) {
int c = a - b;
int sa = isNegOrPos(c);
int sb = isZeroOrOne(sa);
return a * sa + b * sb;
}
public static int getMax2(int a, int b) {
int c = a - b;
int sa = isNegOrPos(a);
int sb = isNegOrPos(b);
int sc = isNegOrPos(c);
int difab = sa ^ sb; // difab == 1 则a、b一正一负,difab == 0 ,则a、b同为正、负。
int samab = isZeroOrOne(difab);
int returnA = sa * difab + sc * samab;
int returnB = isZeroOrOne(returnA);
return a * returnA + b * returnB;
}
}