两数交换方法

在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异或不变

valuevalue
ab
a=a^ba^bb
b=a^ba^ba ^ b ^ b=a^0=a
a=a^ba ^ b ^ aa
ba

因为a ^ b=b ^ a 满足交换律,所以 a ^ b ^ a = b ^ a ^ a = b。

注意:

  1. 对同一个变量自身进行swap,结果为0;
  2. 对两个值相等的变量进行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
在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐