关于异或交换数字的问题

来源:互联网 发布:金融计算器软件 编辑:程序博客网 时间:2024/05/21 12:48
原来写交换两个数字时就喜欢这么写:
*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

看来这个方法无法交换自身,应该谨慎的使用.

原创粉丝点击