绍兴市柯桥中学老师:如何用位异或运算(^)交换两个数的值!

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/29 07:05:45
如何用位异或运算(^)交换两个数的值!哪位高手能解说一下,谢谢!

#include <stdio.h>
int main()
{
int a = 10,b = 23,c;
/*
//先推导:把10和23都转换成二进制数
2 10 0
2 5 1
2 2 0
2 1 1
//得出A=10=0000 1010
演算1*2^1+1*2^3=2+8=10
2 23 1
2 11 1
2 5 1
2 2 0
2 1 1
//得出B=23=0001 0111
演算1*2^0+1*2^1+1*2^2+1*2^4=1+2+4+16=23
//然后设一个中间值C
C=A^B
0000 1010
^ 0001 0111
______________
0001 1101
//得到一个中间值0001 1101把它转换成十进制数
0001 1101
1+1*2^2+1*2^3+1*2^4
1+4+8+16=29
//得出C=29=0001 1101
演算
2 29 1
2 14 0
2 7 1
2 3 1
2 1 1
得到0001 1101(正确)
//A=10=0000 1010
//B=23=0001 0111
//C=29=0001 1101
A=C^A
0001 1101
^ 0000 1010
_____________
0001 0111
得到一个二进制数把它转换为十进制显示
0001 0111
1+2+4+16=23
B=C^B
0001 1101
^ 0001 0111
______________
0000 1010
得到一个二进制数把它转换成十进制显示
0000 1010
1*2^1+1*2^3
=2+8
=10
即满足本题要求,完成实现AB值的交换
另外一种取反的办法
int a = 10,b = 23,c;
printf("取反前:%d %d\n",a,b);
c = ~b;
b = ~a;
a = c;
printf("取反后:%d %d\n",~a,~b);
*/
printf("取反前:%d %d\n",a,b);
c = a^b;
a = c^a;
b = c^b;
printf("取反后:%d %d\n",a,b);
return 0;
}

int a = *;
int b = *;
a = a ^ b;
b = b ^ a;
a = a ^ b;
就能实现ab的交换了

int a,b;
a=1;
b=2;
a=a^b;
b=b^a;
a=a^b;