1.有两个变量a,b,不用if、?: 、switch 或其他判断语句,找出两个数中
较大的:
int max = ((a+b)+abs(a-b))/2
较小的:
int min = ((a+b)-abs(a-b))/2
2.给3个整数a,b,c,用函数实现取3个数的中间数,不用sort。
inline int max(int a,int b) {return a>=b? a:b;} inline int min(int a,int b) {return a<=b? a:b;} inline int medium(int a,int b,int c) { int t1 = max(a,b); int t2 = max(b,c); int t3 = max(a,c); return medium(t1.min(t2,t3); }
3.如何交换a,b并且不适用任何中间变量?
如果采用:
a=a+b; b=a-b; //b=(a+b)-b=a a=a-b; //a=(a+b)-a=b
这样做的缺点是如果a、b都是比较大的数,a=a+b会超界。
a=a^b; b=a^b; //b=(a^b)^b=a 可见x^y=(x&~y)|(~x&y)证明 中的文氏图方法。 a=a^b; //a=(a^b)^a=b
这样做好处是不会超界。