This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
packageclass010;
publicclassCode02_GetMax{
// 请确保,n不是0,就是1
// 0 -> 1 1 -> 0
publicstaticintflip(intn){
returnn^1;
}
// 如果n是非负数,返回1
// 如果n是负数,返回0
publicstaticintsign(intn){
// (n >> 31) & 1 0(int 非负数) 1(int 负数)
// >>> >>
returnflip((n>>31)&1);
}
// 确保 a-b 是不会溢出的
publicstaticintgetMax1(inta,intb){
intc=a-b;
intscA=sign(c);// scA == 1 a - b >= 0 a返回 sca == 0 a-b < 0 b返回
intscB=flip(scA);
returna*scA+b*scB;
}
publicstaticintgetMax2(inta,intb){
intc=a-b;
intsa=sign(a);
intsb=sign(b);
intsc=sign(c);
intdifSab=sa^sb;
intsameSab=flip(difSab);
// 返回a的条件 returnA == 1 应该返回a;
// returnA == 0,不应该返回a
intreturnA=difSab*sa+sameSab*sc;
intreturnB=flip(returnA);
returna*returnA+b*returnB;
}
publicstaticvoidmain(String[]args){
inta=-16;
intb=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