逆运算啊,你是其中的神明啊

本文探讨了不使用额外变量实现两个整数变量值交换的方法,介绍了使用加法和异或运算的技巧,并深入分析了异或运算的特点及其满足的数学性质。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前一阵一个同事告诉我一个题目,整型变量 a、b,要求不利用中间变量或别的存储空间,实现a、b两个值的交换!
这个问题一问我,我当时就没有想出什么办法,可能缺乏这一方面的一贯修养:( 也可能觉得太伤脑筋了,去想这个问题,呵呵

后来,他告诉我可以使用一种方式,加法或者异或运算来解决

#加法解决步骤

b = a + b;

a = b -a;相当于 a = (a + b) -a,实现了a = b的转化

b = b -a;相当于 b = (a + b) -a,由于a的值已经变化相当于b = (a + b) - b,实现了b = a的转化


#异或解决步骤

b = a ^ b;

a = b ^ a;相当于 a = (a ^ b) ^ a,实现了a = b的转化

b = b ^ a;相当于 a = (a ^ b) ^ b,实现了b = a的转化

    他介绍异或的解决步骤要比加法的解决步骤要优良,就是没有符号位或者溢出的影响!异或仅是按位来操作,最后还是会恢复出
它当时的容颜。他当时解释,可以理解为与自身异或,相当于什么都没有做,就恢复出原状,我当时敏感地觉得,如果可以这样解释
的话,异或就应该满足结合律和交换律,呵呵!但是,一直没有时间去验证,遂有了下面的单bit位进行异或时,再用异或来恢复的计算表。
因为异或运算仅针对单位进行操作,我们只用验证单bit位是否能恢复成功,以及满足结合律交换律!


     其实验证只是为了乐趣,我这里想告诉大家的是一个解决问题的方法!我觉得懂得利用加法或者异或来解决这个问题不过是技而已,隐藏在其里面最深的逻辑是什么呢?这个谜底是:信息融合与其逆运算,就是我们将a和b的信息通过某种方式融合在一起,但是,这种方式能用它的逆运算或者存在这样的逆运算,再让他们独立地恢复出来,我想就是这个诀窍了!

    逆运算啊,你是其中的神明啊!!!!!!!!!!!!!!

----验证结合律
1^1^1           -> 1 

0^0^0           -> 0

1^0^1           -> 0 (1)

1^0^0           -> 1



0^1^0           -> 1

0^1^1           -> 0


----验证交换律,顺便验证结合律:) 交换后有几种情况未能想得明白,呵呵,也不多想,就直观地几个吧
1^0^1           -> 0
0^1^1           -> 0
1^1^0           -> 0


1^0^0           -> 1
0^1^0           -> 1
0^0^1           -> 1


0^1^0           -> 1
1^0^0           -> 1
0^0^1           -> 1


0^1^1           -> 0
1^0^1           -> 0
1^1^0           -> 0


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值