a、b交换与比较

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

 这样做好处是不会超界。

原文地址:https://www.cnblogs.com/zhanbiqiang/p/4009580.html