【问题标题】:Swap two registers using only AND, OR, NOT, XOR? [duplicate]仅使用 AND、OR、NOT、XOR 交换两个寄存器? [复制]
【发布时间】:2018-03-08 07:39:20
【问题描述】:

假设您有一个带有 AND、OR、XOR、NOT 和 2 个寄存器 X 和 Y 的处理器。 交换两个寄存器的值最聪明的方法是什么?

【问题讨论】:

  • 不是一个相关的问题,因为真正的 CPU 总是有 MOV 指令和布尔值。在极少数情况下 xor-swap 很有用,但您必须发明一个假设的 CPU 以使其成为正确答案这一事实有点说明它在实践中的相关性。
  • xor-swap 的修改版本,其中你和中间的掩码很有趣。您可以交换一些位,而将其他位保留在其原始寄存器中。
  • @peter - 原则上,即使在存在 MOV 的情况下,“技巧”在传统 CPU 上也很有用,因为您避免使用临时寄存器。一个例子是在循环体中,其中一对寄存器在每次迭代时交换位置。如果寄存器压力很大,则可能没有用于 MOV 交换的空闲寄存器。您不能只交换程序集中的角色而不展开循环,如果它很大,这可能会令人望而却步。一个概括是寄存器“轮换”,其中超过 2 个寄存器交换位置,xor 在这里也很有用。
  • @TedatORCL.Pro 虽然您的追求是崇高的,但没有人真正从重复发布现有问题中获利。回答您自己的问题的一个好方法是针对您最近解决的问题发布问答。
  • @TedatORCL.Pro 一个好的入门方法是找到一个您感兴趣的标签,打开页面http://stackoverflow.com/questions/tagged/<tag> 并开始回答问题。通过这种方式,您可以了解该网站的运作方式,同时帮助其他人解答您的问题。

标签: assembly


【解决方案1】:
X := X XOR Y
Y := Y XOR X
X := X XOR Y

【讨论】:

    猜你喜欢
    • 2011-01-24
    • 2013-10-12
    • 1970-01-01
    • 2014-06-04
    • 2021-12-05
    • 2015-05-09
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多