新闻  |   论坛  |   博客  |   在线研讨会
一种不需要中间变量交换两个变量内容的方法
sjdai | 2010-03-13 15:38:35    阅读:2657   发布文章

以前闲聊的时候朋友说有一种方法,不需要中间变量,就可以将两个变量的内容交换。
开始我觉得这方法挺玄乎,不过我并不是不相信没有这样的方法,而是认为可能需要某些特定条件,后来闲暇的时候仔细想了想,发现确实存在这样的方法,大多数单片机的汇编指令都可以实现。

肯定不是有多个寄存器的单片机,比如除了累加器外还有偏移寄存器,实现就非常简单。
LDX a
LDY b
TAX b
TAY a
只要四条汇编指令就可以实现,但这肯定不是我们所说的方法。

来看看真正的代码。
LDA x表示将变量x的内容装入累加器
XOR x表示累加器的内容与变量x的内容进行异或
STA x表示将累加器的内容存进变量x
具体代码,假定是交换a,b两变量,初始内容为a0,b0
                 累加器内容         a变量内容         b变量内容
LDA a   ;  a0                        a0                       b0
XOR b  ;  a0^b0                  a0                       b0
STA a   ;  a0^b0                  a0^b0                 b0
XOR b  ;  a0^b0^b0=a0     a0^b0                 b0 
STA b   ;  a0                         a0^b0                a0
XOR a  ;  a0^a0^b0=b0     a0^b0                a0
STA a   ;  b0                         b0                      a0 

嘿嘿,是不是已经实现了交换?
这种方法对于实际应用意义并不大,不过可以加强程序员对逻辑运算的理解,有时候逻辑运算可以发挥一些出人意料的功效,这里利用的就是对于同一个数连续异或两次,原数保持不变。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
zhwt  2010-04-05 10:16:01 

xiexie……很受学习!自己还要努力!

Jason_Zhang  2010-03-31 23:47:06 

回想当年学汇编时,我也用过这种异或的方法,觉得很神奇。可以到现在把汇编全忘了

啰嗦一些以单片机应用为主的电子技术问题,偶尔发点牢骚。如果您想我了,邮件(daishangju@163.com)和MSN(sj_dai@hotmail.com)都能找到我。本博客提供《删繁就简-单片机入门到精通》一书下载链接,点击最底部的“查看更多”可翻页。
推荐文章
最近访客