package class021; public class Code02_GetMax { // 输入参数:n,一定要保证,n不是1就是0 // n == 0 -> 1 // n == 1 -> 0 public static int flip(int n) { return n ^ 1; } // 输入参数n,可以是任何一个整数 // 如果n是非负数,返回1(int) // 如果n是负数,返回0(int) public static int sign(int n) { return flip((n >> 31) & 1); } // a和b中,谁大返回谁 public static int getMax1(int a, int b) { int c = a - b; int scA = sign(c); // c >= 0 scA = 1; c < 0 scA = 0 int scB = flip(scA); return a * scA + b * scB; } public static int getMax2(int a, int b) { int c = a - b; // c是a-b的差值,有可能溢出,也有可能不溢出 int sa = sign(a); // a的符号,求出,a>=0 1, a<0 0 int sb = sign(b); // b的符号,求出,b>=0 1, b<0 0 int sc = sign(c); // c的符号,求出,c>=0 1, c<0 0 // 如果a和b的符号,不一样,difSab == 1 // 如果a和b的符号, 一样,difSab == 0 int difSab = sa ^ sb; // 如果a和b的符号,一样,sameSab == 1 // 如果a和b的符号,不一样,sameSab == 0 int sameSab = flip(difSab); int returnA = difSab * sa + sameSab * sc; int returnB = flip(returnA); return a * returnA + b * returnB; } public static void main(String[] args) { int a = -16; int b = 1; System.out.println(getMax1(a, b)); System.out.println(getMax2(a, b)); a = 2147483647; b = -2147480000; System.out.println(getMax1(a, b)); // wrong answer because of overflow System.out.println(getMax2(a, b)); } }