通常我们交换一个数字,需要引入第三个变量来储存才能进行交换,但利用异或运算可以不需要第三个变量作为中间量。
1
2
3
4
5
6
7
8
9
10
11
|
#include "stdio.h"
int a = 1;
int b = 2;
int t;
int main(viod){
printf("a=%d,b=%d\n",a,b);
t = a;
a = b;
b = t;
printf("a=%d,b=%d\n",a,b);
}
|
结果输出:
如果用异或来进行交换:
1
2
3
4
5
|
unsigned int a=60; //0011 1100
unsigned int b=13; //0000 1101
a=a^b; //a=a^b=0011 0001
b=a^b; //b=a^b=0011 1100 相当于b1=(a^b)^b
a=a^b; //a=a^b=0000 1101 相当于a1=(a^b)^((a^b)^b)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include<stdio.h>
int main( )
{
unsigned int a=60; //0011 1100
unsigned int b=13; //0000 1101
printf("a=%d,b=%d",a,b); //输出a,b的值
printf("\n");
a=a^b; //a=a^b=0011 0001
b=a^b; //b=a^b=0011 1100
a=a^b; //a=a^b=0000 1101
printf("a=%d,b=%d",a,b); //输出a,b的值
}
|
结果输出:
整型负数也可交换
注意:位运算只支持整数运算,不支持浮点型运算。因此上述的方法用在浮点型运算编译不会通过。
参考资料
程序设计入门–C翁恺
《c语言程序设计》–谭浩强
《C Primer Plus》–Stephen Prata
C语言中文网
C语言教程|菜鸟教程