问题1: 交换两个整形变量
int a=10,b=20; A和B为常量
使用临时变量的方法就省略了
方法1:数值变化
a=A*a+B*b;b=(a-B*b)/A;a=(a-A*b)/B;
由此衍生出来常见的:
1.1: a=a+b; b=a-b; a=a-b;
1.2: a=a+b-(b-a);//利用算数表达式从左到右结合
1.3: a=b-a; b=b-a; a=b+a;
方法2:位异或
a^=b; b^=a; a^=b; //无数值操作,速度快
方法3:交换地址
变量的地址=基地址(16位)+位置偏移量(16位)
因此实际位置偏移量=地址&0x0000ffff
同时要考虑
1.地址不能为负数,否则系统会自动将其变成补码形式
2.系统会自动给地址加上基地址。
int *a,*b;
a=new int(10);
b=new int(20);
if(a<b)
{
a=(int*)(b-a);//系统自动给a加上基地址。
b=(int*)(b-(int(a)&0x0000ffff));
a=(int*)(b+(int(a)&0x0000ffff));
}
else
{
b=(int*)(a-b);
a=(int*)(a-(int(b)&0x0000ffff));
b=(int*)(a+(int(b)&0x0000ffff));
}
一般来说 几种方法的速度:方法2>方法3>方法1