两个数的交换(位运算)

昨天在重新学习c语言的时候,看到位运算,然后看到一个有趣的问题,好像以前也看过这个题,就分享一下吧。
两个数的交换,不借助第三个变量空间。
先放代码:

#include <stdio.h>

#define SWAP1(a,b) \
{                  \
    int temp = a;  \
    a = b;         \
    b = temp;      \
}

#define SWAP2(a,b) \
{                  \
    a = a + b;     \
    b = a - b;     \
    a = a - b;     \
}

#define SWAP3(a,b) \
{                  \
    a = a ^ b;     \
    b = a ^ b;     \
    a = a ^ b;     \
}

int main()
{
    int a = 1;
    int b = 2;
    
    SWAP1(a,b);
    SWAP2(a,b);
    SWAP3(a,b);
    
    return 0;
}

分析:
交换两个数,在初学C语言的时候,就学习了两个数的交换函数,还借此学习了形参和实参。这里不讨论,直接采用了宏定义。
第一种方法,是我们最容易想到的,借助第三个中间变量,达到交换的目的。
第二种方法,数学中的和差方法,做到了不借助第三个变量,但有一个缺陷,如果整型a,b数很大,相加超过了int,就会发现有问题。
第三种方法,使用位运算中的异或运算,其最根本思想和第二种类似,但避免了第二种方法的缺陷,突然发现位运算有点神奇。但也有不足,只能运用在整型中,而第一个就没这些问题。
所以各有优劣吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值