美文网首页
交换两个基本数据类型变量的值

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

作者: Andney | 来源:发表于2019-07-19 17:52 被阅读0次

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


    已知两个基本数据类型的变量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 );
    

    相关文章

      网友评论

          本文标题:交换两个基本数据类型变量的值

          本文链接:https://www.haomeiwen.com/subject/efgslctx.html