E23.【C语言】练习:不创建第三个变量实现两个整数的交换
目录
题目条件
思路1(+ -)
思路2 (^)(XOR)
往期推荐
1.题目条件
禁止使用以上代码
2.思路1:+ -运算
a=a+b;
b=a-b;
a=a-b;
但这样有潜在的问题 :a,b存储的数字过大,a+b可能超过范围
因此改用思路2
3.思路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 自反定律
4.除此之外...
可以用汇编(这里以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语言】初识操作符 下