【问题标题】:How do i do a bitshift right in binary?我如何在二进制中正确进行位移?
【发布时间】:2014-11-15 02:57:43
【问题描述】:

希望这是一个简单的问题,但我一生都无法弄清楚如何在二进制中进行位移。这是在 LC3 环境中完成的。我只需要知道如何算术除以二并向右移动。我知道向左移动很简单,只需将二进制值添加到自身,但我尝试了相反的移位右移(从自身减去,注意然后减去等)将不胜感激。

或者,如果您有更好的方法将 x00A0 移动到 x000A,那也太棒了。谢谢!

【问题讨论】:

标签: binary bit-shift shift lc3


【解决方案1】:

这是一篇较旧的帖子,但我遇到了同样的问题,所以我想我会发布我发现的内容。

当您必须向右移动时,通常会将二进制数减半(除以 2),但这在 LC-3 中可能是一个挑战。这是我编写的用于执行向右位移的代码。

; Bit shift to the right
.ORIG x3000

MAIN
    LD R3, VALUE

    AND R5, R5, #0      ; Reseting our bit counter

    B_RIGHT_LOOP
        ADD R3, R3, #-2     ; Subtract 2 from the value stored in R3
        BRn BR_END      ; Exit the loop as soon as the number in R3 has gone negative 
        ADD R5, R5, #1      ; Add 1 to the bit counter
        BR B_RIGHT_LOOP     ; Start the loop over again 
    BR_END

    ST R5, ANSWER       ; Store the shifted value into the ANSWER variable

    HALT            ; Stop the program

; Variables
VALUE   .FILL x3BBC     ; Value is the number we want to do a bit-shift to the right
ANSWER  .FILL x0000

.END

请记住,使用此代码,最左边的位 B[0] 会丢失。如果我们试图向右移动的数字是负数,则此代码也不起作用。因此,如果设置了位 [15],则此代码将不起作用。 示例:

VALUE .FILL x8000    ; binary value = 1000 0000 0000 0000
                     ; and values higher than x8000
                     ; won't work because their 15th
                     ; bit is set

这至少应该让你走上正轨。

【讨论】:

    【解决方案2】:
    .ORIG x3000
            BR      main
    ;»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
    ;       UL7AAjr
    ;       shift right register R0
    ;       used rigisters R1, R2, R3, R4, R5
    ;»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
    shift_right
            AND     R4, R4, #0      ; R4 - counter = 15 times
            ADD     R4, R4, #15
            AND     R1, R1, #0      ; R1 - temp result
            LEA     R2, _sr_masks   ; R2 - masks pointer
    _sr_loop
            LDR     R3, R2, #0      ; load mask into R3
            AND     R5, R0, R3      ; check bit in R0
            BRZ     _sr_zero        ; go sr_zero if bit is zero
            LDR     R3, R2, #1      ; R3 next mask index
            ADD     R1, R1, R3      ; add mask to temp result
    _sr_zero
            ADD     R2, R2, #1      ; next mask address
            ADD     R4, R4, #-1     ; all bits done?
            BRNP    _sr_loop
    
            AND     R0, R0, #0      ; R0 = R1
            ADD     R0, R0, R1
            RET
    
    _sr_masks
            .FILL   x8000
            .FILL   x4000
            .FILL   x2000
            .FILL   x1000
            .FILL   x0800
            .FILL   x0400
            .FILL   x0200
            .FILL   x0100
            .FILL   x0080
            .FILL   x0040
            .FILL   x0020
            .FILL   x0010
            .FILL   x0008
            .FILL   x0004
            .FILL   x0002
            .FILL   x0001
    ;»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
    main
            LD      R0, data
            JSR     shift_right
            HALT
    
    data   .FILL   xFFFF
    
    
    .END
    

    【讨论】:

      【解决方案3】:
      ; right shift R0 1-bit with sign-extention
      ; Algorithm:    build bit form msb one by one
      .ORIG   x3000
              AND     R1, R1, #0  ; r1 = 0
              ADD     R2, R1, #14 ; r2 = 14
              ADD     R0, R0, #0  ; r0 = r0
              BRzp    LOOP
              ADD     R1, R1, #-1 ; r1 = xffff
      LOOP    ADD     R1, R1, R1  ; r1 << 1
              ADD     R0, R0, R0  ; r0 << 1
              BRzp    MSB0
              ADD     R1, R1, #1  ; r1++
      MSB0    ADD     R2, R2, #-1 ; cnt--
              BRp     LOOP
              ADD     R0, R1, #0  ; r0 = r1
              HALT
      .END
      

      【讨论】:

        【解决方案4】:
        ; right shift R0 1-bit with sign-extention
        ; Algorithm:    left-rotate 14 times with proper sign
        .ORIG   x3000
                LD      R1, CNT
                ADD     R2, R0, #0
        LOOP    ADD     R0, R0, R0  ; r0 << 1
                BRzp    NEXTBIT
                ADD     R0, R0, #1
        NEXTBIT ADD     R1, R1, #-1
                BRp     LOOP
                LD      R3, MASK
                AND     R0, R0, R3
                ADD     R2, R2, #0
                BRzp    DONE
                NOT     R3, R3
                ADD     R0, R0, R3
        DONE    HALT
        MASK    .FILL   x3FFF
        CNT     .FILL   14
        .END
        

        【讨论】:

          【解决方案5】:
          ; right shift R0 1-bit with sign-extention
          ; Algorithm:    look-uo table and auto-stop
          .ORIG   x3000
                  AND     R1, R1, #0  ; r1 = 0
                  LEA     R2, TABLE   ; r2 = table[]
                  AND     R0, R0, #-2
          LOOP    BRzp    MSB0
                  LDR     R3, R2, #0  ; r3 = table[r2]
                  ADD     R1, R1, R3  ; r1 += r3
          MSB0    ADD     R2, R2, #1  ; r2++
                  ADD     R0, R0, R0  ; r0 << 1
                  BRnp    LOOP
                  ADD     R0, R1, #0  ; r0 = r1
                  HALT
          TABLE
                  .FILL   xC000
                  .FILL   x2000
                  .FILL   x1000
                  .FILL   x0800
                  .FILL   x0400
                  .FILL   x0200
                  .FILL   x0100
                  .FILL   x0080
                  .FILL   x0040
                  .FILL   x0020
                  .FILL   x0010
                  .FILL   x0008
                  .FILL   x0004
                  .FILL   x0002
                  .FILL   x0001
          .END
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-06-18
            • 1970-01-01
            • 1970-01-01
            • 2011-02-07
            • 1970-01-01
            • 1970-01-01
            • 2016-08-12
            相关资源
            最近更新 更多