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


前一阵一个同事告诉我一个题目,整型变量 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


你可能感兴趣的:(存储)