原来写交换两个数字时就喜欢这么写:
*a ^= *b;
*b ^= *a;
*a ^= *b;
感觉很酷,但是不知道为什么可以交换...
看了那本深入理解计算机系统才知道
原来是这样啊:
*a ^= *b; 以后:a变为 a^b, b没变
*b ^= *a; 以后:a为还a^b,b为((a^b)^b)就是a
*a ^= *b; 以后:a变为(a^b)^a,就是b,b还是a
呵呵,是一个数学原理...
可是这个小东西不是太通用,比如
#include <stdio.h>
void swap(int *a ,int *b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
int main()
{
int a=9;
swap(&a,&a);
printf("%d \n",a);
return 0;
}
结果就有点奇怪了,如果从过程上看:
*a ^= *b; 就是 0000 0000 0000 1001和0000 0000 0000 1001异或,*a变为了0
*b ^= *a; 就是 0000 0000 0000 0000和0000 0000 0000 0000异或,*a变为了0
*a ^= *b; 还是上一句,那么*a就永远变为了0
看来这个方法无法交换自身,应该谨慎的使用.
*a ^= *b;
*b ^= *a;
*a ^= *b;
感觉很酷,但是不知道为什么可以交换...
看了那本深入理解计算机系统才知道
原来是这样啊:
*a ^= *b; 以后:a变为 a^b, b没变
*b ^= *a; 以后:a为还a^b,b为((a^b)^b)就是a
*a ^= *b; 以后:a变为(a^b)^a,就是b,b还是a
呵呵,是一个数学原理...
可是这个小东西不是太通用,比如
#include <stdio.h>
void swap(int *a ,int *b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
int main()
{
int a=9;
swap(&a,&a);
printf("%d \n",a);
return 0;
}
结果就有点奇怪了,如果从过程上看:
*a ^= *b; 就是 0000 0000 0000 1001和0000 0000 0000 1001异或,*a变为了0
*b ^= *a; 就是 0000 0000 0000 0000和0000 0000 0000 0000异或,*a变为了0
*a ^= *b; 还是上一句,那么*a就永远变为了0
看来这个方法无法交换自身,应该谨慎的使用.