交换两个基本数据类型变量的值

交换两个基本数据类型变量的值


已知两个基本数据类型的变量a、b,要求交换两个变量的值。下面以double类型为例进行说明:

1. 借助于临时变量的方式

int main(int argc, char *argv[]) {
    double a = 10.5;
    double b = 20.4;
    
    // 1. 先暂存变量a的值到临时变量tmp中
    double tmp = a; 
    // 2. 变量b的值赋值给变量a(即,此时变量a的值是原先变量b的值)
    a = b;
    // 3. 将原先暂存到变量tmp中的变量a的值 赋值给 变量b
    b = tmp;
    
    printf("a = %lf,  b = %lf", a, b); // 输出:a = 20.400000,  b = 10.500000
}

将其封装成一个函数如下:

// 交换两个double变量的值
void swapDouble(double *a, double *b)
{
    double tmp = *a;
    *a = *b;
    *b = tmp;   
}

// 具体使用
double a,b;
swapDouble(&a, &b); // 需要传递两个变量的地址指针,才能在swapDouble方法内修改方法外两个变量a、b的值

2. 两个变量相互加减的方式

void swapDouble(double *a, double *b)
{
    *a = *a + *b; // a的新值为:原先a 和原先b 的和
    *b = *a - *b; // b的新值为  (原先a + 原先b) - 原先b = 原先a 的值 
    *a = *a - *b; // b的新值为  (原先a + 原先b) - 原先a(即b的新值) = 原先a 的值 
}

3. “异或”位运算的方式

位运算操作是由处理器支持的底层操作,因此运行速度很快。尽管现代计算机处理器拥有了更长的指令流水线和更优的架构设计,使得加法和乘法运算几乎与位运算一样快,但是位运算消耗更少的资源。

注意:该方式仅仅适用于两个整数类型变量之间的交换

void swapInt(int *a, int *b)
{
    *a = (*a)^(*b);
    *b = (*a)^(*b);
    *a = (*a)^(*b);
}


补充内容


异或的规则:

如果a、b两个值不相同,则异或结果为1。

如果a、b两个值相同,异或结果为0。

按位异或的3个特点:

0^0=0,0^1=1 0异或任何数任何数

1^0=1,1^1=0 1异或任何数等价于任何数取反

任何数异或自己把自己置0


按位异或的几个常见用途:

1. 使某些特定的位翻转

例如对数10100001的第2位和第3位翻转,则可以将该数与00000110进行按位异或运算。

10100001^00000110 = 10100111

2. 实现两个值的交换,而不必使用临时变量。

例如交换两个整数a=10100001,b=00000110的值,可通过下列语句实现:

a = a^b; // a=10100111
b = b^a; // b=10100001
a = a^b; // a=00000110

3. 在汇编语言中经常用于将变量置零:

xor a,a

4. 快速判断两个值是否相等

举例1: 判断两个整数a,b是否相等,则可通过下列语句实现:

return ( (a^b) == 0 );
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。