c语言中交换a、b两个数的一种算法

来源:百度知道 编辑:UC知道 时间:2024/06/25 04:29:24
哪位高手帮忙分析一下如下算法:
a^=b^=a^=b;
是怎样做到交换a、b两数的。
自己弄懂了,^是位异或的运算符,即比较相同两位的异同,如果相同则赋值为0,否则为1;例3^5=6计算如下:
3=(00000011)2
5=(00000101)2
比较两数他们右数第二第三位不同,根据规则赋为1,其余为0,即运算后为
(00000110)2=6
原式从右到左,a^=b ----> b不变,a^=b即取出所有不相等的位存入a
第二次b^=a,a不变(a为所有不相等的位),b做位异或运算,如果b中位与a(a为所有不相等的位)相同,则原a中的该位必为0(此处有2种情况,不详细说明了);若不同则a中该位必为1.因此b^=a相当于将b变成了原来的a.
最后一个a^=b同上。效果是将a变成原来的b
此算法最大的优点是省略了中间变量,但只能用于相同类型数的交换。
OK,写到这里,与有同样疑惑的同学分享一下。

a=a^b^(a^b)

定义两个数int x,y;

如果x=0,y=0,x^y==0;
如果x=0,y=1,x^y==1;
如果x=1,y=0,x^y==1;
如果x=1,y=1,x^y==0;

第一次找出不同的地方,并将不同之处用1标记并赋给a,然后用b和不同进行对比,反过来得到a的值,a的值发生改变,b变成a的原值,后一步同理。把两个数写成二进制的形式“异”一下就知道了。