分类: C/C++
2010-06-23 15:22:07
int a,b;
a=10;b=12;
a=b-a;//a=2;b=12
b=b-a;//a=2;b=10
a=b+a;//a=12;b=10
int *a,*b;
a=new int(10);//给指针赋值
b=new int(20);//a=0x00030828,b=0x00030840
a=(int*)(b-a);//a=0x00000006
b=(int*)(b-int(a));//b=0x00030828
a=(int*)(b+int(a));//a=0x00030840
int a=10,b=12;//a=1010^b=1100;
a=a^b;//a=0110^b=1100;
b=a^b;//a=0110^b=1010;
a=a^b;//a=1100=12;b=1010;
如果仔细思考,可以发现实际上有无数种方法。为什么需要第三个变量?我想这是绝大多数初学编程时都思考过的问题。我本身是做信号的,所以从信息的角度来分析。两个变量,必然存在两份信息(姑且以份为单位),如果直接交换,a=b,则a原来的信息丢失,所以引入一个临时变量来保存a的信息,以确保信息完整性。也就是说,temp的作用就是保存交换过程可能损失的信息量,那么只要这个信息量不损失,则无需temp.做编解码的人都知道,编码的是残差数据。残差数据包含的就是那额外的信息量。那么,完全可以在交换过程中传递额外信息,也就是a,b之间的耦合信息,则交换过程不会发生信息丢失,也就无需第三个变量。这耦合信息可以是a-b,也可以是a^b,还可以是a*b.如:
a=a*b;
a=a/b;
b=a/b;
同样可以完成交换(仅提供思路,未考虑除0溢出等问题)。举一反三,可以有无穷种方法,但原理都是一样的。
chinaunix网友2011-05-02 20:11:37
方法一和方法 a=a*b; a=a/b; b=a/b; 都有可能导致溢出,毕竟整型表示的范围还是有限制的,a*b 和 a-b谁都不可能保证在整型范围内