共有回帖数 0 个
-
刚在网上找了一下关于2数不借助第3个数互换的问题,竟然没找到,可能是我方法不对,然后自己想了会,这里我将我自己的思路说一下:
两数如何不借助第三者进行互换呢?公式可能网上都查的到,这里就不太啰嗦。我这里主要是想对这个问题进行分析,在你第一次接触到这个问题时,你该如何下手去思考。
在这里我举一个例子,然后针对这个例子进行讲解;
说明2个数
A:76H 01110110B
B:58H 01011000B
我们来分析这两个数是如何互换的。
1。〉两数不依靠第三个数进行互换,无外乎就是其自身的一些位运算,如下:
A 与 B :50H 01000000B
A 或 B : 7EH 01111110B
A 异或 B : 2EH 00101110B
2。〉我们反过来推。AB能否一次就互换过来呢?实践告诉我们是不可能的,要不也不会在一些经典的算法中还要借助第三者来做桥梁。那么,我们只能成功将其中一个换到另一个(A换到B)上,在将另一个放到第一个(B到A)上。好像有点啰嗦,其实不然,你有没有想过,既然B已经被换掉了,那我们如何将B放到A上呢?那我们仔细想想,有没有一个什么数,能使A通过和它经过某种运算就得到B,同理,也可以使B通过它经过某种运算就得到A?也就是说A,B能通过它达到互换?哈哈。。 说了这么多,这个数才是我们的主题。整篇的核心就是如何找到这个数。
3。〉那么我们如何找到这个数呢?不忙,我们来分析一下1。〉中的各位运算规律。对于各位的操作如下:
A 与 B :相同不变,不同为0
A 或 B : 相同不变,不同为1
A 异或 B : 相同为0,不同为1
看到上面的规律了吗?第一感觉是什么?异或运算很有特点,完全就是1==0的转换,没错!就是这样,我在上面把互换的数全部写成了二进制的形式,原因就在这里。核心思想也在这里。
A,B通过某中介数可进行互换。而异或运算的特点不是正好可以帮助我们实现这一点吗?我们能否把AB两数中相同的位提出。结果如下:
AB相同的部分:01_1___0B 中间不同部分我用底横线替代了。到这里你有没有想到点什么?没错!这个数就是我们要找的中介数。规律如下:
中介数 :01_1___0B
A数不同位:__1_011_B
B数不同位:__0_100_B
中介数 或运算 A =〉A
中介数 或运算 B =〉B
那么,我们将中介数中间的不同位全部补上1,相同的位换上0看看:
真中介数:00101110B
哈哈.. 这个才是我们真正的中介数.看看我们下面的运算.
B = A 异或 B
A = B 异或 A
4.好了,我们只要知道这个真中介数,就可以利用它进行互换了.那么我们如何得到这个中介数呢?上面的思路搞通了,这个中介数的得来就不费什么功夫了.
真中介数 = A 异或 B
哈哈..,就这么简单.我们将得到的真中介数放到其中一个数中,然后就可以运算得到了.
5.公式如下:
A = A 异或 B ;A已被改变,不过没关系,我们可以获取它
B = A 异或 B ;把A换到B上来了
A = A 异或 B ;我们已经把B也拿回来了.
6.全文到此完! 顺便说一句,我这里只是利用单字节的两数互换,起始对于多字节的两数互换也是一样的道理.大家没事无聊闲着荒可以自己试着写写看.
楼主 2016-02-12 15:17 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知