笔记-不创建额外变量交换两数的值

第一种方案:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a = 10, b = 20;
    printf("交换前:a的值为%d,b的值为%d\n",a,b);
    a = a + b;
    b = a - b;
    a = a - b;
    printf("交换后:a的值为%d,b的值为%d\n",a,b);
    return 0;
}

这里运行结果为:

这种方式具有一定的问题:因为采用了整型数据的加法,所以在进行较大数值的交换过程中容易出现数值过大从而溢出的现象。

第二种方案:

采用按位异或的运算:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a = 10, b = 20;
    printf("交换前:a的值为%d,b的值为%d\n",a,b);
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    printf("交换后:a的值为%d,b的值为%d\n",a,b);
    return 0;
}

解释^交换原理:

我们可知,按位异或的规则是相同为0,相异为1。

举例说明 :

a ^ a = 0

a ^ 0 = a

3 ^ 3 ^ 5 = 5

3 ^ 5 ^ 3 = 5

(3的补码: ……011

5的补码:……101

3 ^ 5:……110

3 ^ 5 ^ 3 : 101 )

由上分析得,按位异或满足交换律。

下面分析代码:

a = a ^ b

b = a ^ b(将a = a ^ b带入到式中,可得b = a ^ b ^ b 结果就为a)

a = a ^ b(将a = a ^ b带入式中,此时又有b = a,所以得出a = a ^ b ^ a结果为b )

最终起到了交换的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值