C-两数交换合集
·
两数交换方法
在c语言中,将两个数进行交换,我知道的方法有4种,我自己倾向于方法3。
方法1
#define SWAP1(a, b) {a = a + b; b = a - b; a = a - b;}
void swap1(int* a, int* b)
{
if (a == b)
return;
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
int a = 5;
int b = 15;
int c = 5;
//SWAP1(a,a); //a的值为0
//SWAP1(a,c); //a,c的值不变
//SWAP1(b,c); //b,c的值交换
//swap1(&a,&a); //a的值不变
//swap1(&a,&c); //a,c的值不变
//swap1(&b,&c); //b,c的值交换
方法2
异或交换
相同为0,相异为1
x^1 = !x x与1异或,x取反 —> 与1异或取反
x^0 = x x与0异或,x不变 —> 与0异或不变
value | value | |
---|---|---|
a | b | |
a=a^b | a^b | b |
b=a^b | a^b | a ^ b ^ b=a^0=a |
a=a^b | a ^ b ^ a | a |
b | a |
因为a ^ b=b ^ a 满足交换律,所以 a ^ b ^ a = b ^ a ^ a = b。
注意:
- 对同一个变量自身进行swap,结果为0;
- 对两个值相等的变量进行swap,显然两个变量的值不变;
介绍完异或交换的原理,接下来,上代码
#define SWAP2(a, b) {(a) ^= (b) ^= (a) ^= (b);}
int a = 5;
int b = 5;
int c = 5;
SWAP2(a,a);//a的值为0
SWAP2(b,c);//b和c的值仍为5
所以在使用SWAP2(a,b)时,需要注意a,b不能是同一个变量。当然也可以将异或交换定义成函数
void swap2(int* a, int* b)
{
if (a == b) //判断a,b是否是同一个变量
return;
(*a) ^= (*b) ^= (*a) ^= (*b);
}
int a = 5;
int b = 15;
int c = 5;
swap2(&a,&a);
swap2(&b,&c);
printf("a=%d, b=%d, c=%d\n", a, b, c);
//a=5, b=5, c=15
方法3
#define SWAP3(a, b) {a = a+b-(b=a);}
int a = 5;
int b = 15;
int c = 5;
//SWAP3(a,a); //a的值不变
//SWAP3(a,c); //a,c的值不变
//SWAP3(b,c); //b,c的值交换
方法4
最简单直接的方法
#define SWAP4(a, b) ({int tmp = 0;tmp = a;a = b;b = tmp;})
void swap4(int* a, int* b)
{
int tmp = 0;
tmp = *a;
*a = *b;
*b = tmp;
}
int a = 5;
int b = 15;
int c = 5;
//swap4(&a,&a); //a的值不变
//swap4(&a,&c); //a,c的值不变
//swap4(&b,&c); //b,c的值交换
QQ讨论群:679603305
更多推荐
已为社区贡献4条内容
所有评论(0)