【问题标题】:Implementing rotate left using AND, NOT, and ADD operations使用 AND、NOT 和 ADD 操作实现向左旋转
【发布时间】:2011-03-01 02:00:55
【问题描述】:

我正在实现一个 16 位位移器,将位向左旋转 r。我只能访问ANDNOTADD 操作。有 3 个条件码:negativezeropositive,当您使用这些操作时会设置它们。

这是我的方法:

  1. 如果最高有效位是1,则AND 带有1000 0000 0000 0000 的数字将条件代码设置为
  2. ADD 本身的号码。这会将位向左移动一位。
  3. 如果 MSB 为 1,则结果为 ADD 1
  4. 循环执行步骤 (1)-(3) r 次。

还有其他有效的方法可以做到这一点吗?

【问题讨论】:

  • 嗯,很有趣,但可能是一个 SO 问题。
  • 逻辑左移和算术左移都将新的 LSB 设置为 0。您的方法是向左旋转(或循环移位)。
  • 或代码高尔夫和编程难题问题。 codegolf.stackexchange.com
  • @RD01 是的,抱歉。这就是我想要的。
  • @Orbling 我已将其标记为“离题——属于 SO”

标签: assembly


【解决方案1】:

既然这是作业,我会帮你考虑的。

2 * 2 = 4
4 * 2 = 8
8 * 2 = 16

0010 * 0010 = 00100
0100 * 0010 = 01000
1000 * 0010 = 10000

左移是一种[未知的]操作。可以使用 AND、NOT 和 ADD 来实现 [一些未知的] 操作...

【讨论】:

  • 回头看cmets,看起来他实际上是在做一个向左旋转的操作,但命名不正确。他的算法也证实了这一点。
【解决方案2】:

这里有一些 x86 代码可以帮助您入门:

; I'm assuming the number you want to rotate is in ax
; I'm assuming the number of bits to rotate is in cx
loop_start:
  add cx, -1                  ; Can only use add, so add -1
  jo loop_end                 ; If cx is < 0
  mov bx, ax                  ; Copy ax into bx
  add ax, ax                  ; shift ax left 1 bit
  and bx, 1000000000000000b   ; Test the msb of bx
  jz loop_start               ; if the msb is zero, jump
  add ax, 1                   ; if the msb is one, add one to ax
  jmp loop_start              ; Loop
loop_end:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多