E23.【C语言】练习:不创建第三个变量实现两个整数的交换

目录

1.题目条件

2.思路

思路1:+/-运算

思路2:^运算(XOR)

复习异或运算的性质

因此引出一系列定律:

3.除此之外...

4.往期推荐


1.题目条件

int tmp = a;
a = b;
b = tmp;

禁止使用以上代码

2.思路

思路1:+/-运算

a=a+b;
b=a-b;
a=a-b;

但这样有潜在的问题 :a,b存储的数字过大,a+b可能超过范围

 因此改用思路2

思路2:^运算(XOR)

复习异或运算的性质

异或运算==半加运算==不进位运算

0 XOR 0 == 0;0 XOR 1 == 1 XOR 0== 1; 1 XOR 1== 0 (1+1==10不进位,是0)

因此引出一系列定律:


归零定律:a XOR a == 0

恒等定律:a XOR 0 == a

交换定律:a XOR b == b XOR a

*(下面会用到)自反定律:a XOR b XOR a == b

*(下面会用到)结合定律:a XOR b XOR c == a XOR (b XOR c) == (a XOR b) XOR c


可以想到:

a=a^b;
b=a^b;
a=a^b;

解释:a=a XOR b; -->b=(a XOR b) XOR b == a XOR (b XOR b) == a XOR 0 == a 结合定律

-->a=a XOR b == (a XOR b) XOR a == a XOR b XOR a == b 自反定律

重要提醒:异或交换两个数的值只能适用于整形类型

3.除此之外...

可以用汇编(这里以8086为例)利用栈交换数据

ax视作变量a,bx视作变量b

mov ax,1000

mov ss,ax

mov sp,0010   ;初始化栈顶

mov ax,001A

mov bx,001B

push ax

push bx

pop ax

pop bx

4.往期推荐

14.【C语言】初识操作符 上

15.【C语言】初识操作符 下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangcoder

赠人玫瑰手有余香,感谢支持~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值