【问题标题】:LMC: base conversion from decimal to base 9 includedLMC:包括从十进制到基数 9 的基本转换
【发布时间】:2019-03-29 02:43:06
【问题描述】:

我正在尝试创建一个 LMC 汇编代码,该代码将允许用户输入两个输入:一个十进制数和该数字应转换为的基数。该代码应该能够将任何十进制数转换为 2 到 9 之间的任何基数。

我知道除法在 LMC 上不可用:我可以使用减法。可以说,从十进制 12 到基数 3,我能够得到 12-3-3-3-3= 4,但是我怎样才能让代码理解除法的其余部分 12/3= 4 和其余部分除法是 0 和 4-3=1 但 4/3=1,... 所以除法的其余部分是 1-3=-2 并且 1/3 是 0,33... 所以其余部分是 1。现在以相反的方式阅读它,以 2 为底的十进制 12 是 110。

但同样,即使是 1-3= -2:我如何才能理解其余部分是 1?

另外,我怎样才能让代码理解它在哪个基础内?我是否首先创建一个长代码来检测碱基?假设它会变成BRA,这取决于它是哪个基础,那么我什至不确定它是否对所有基础都是相同的算法......

我在这里有点困惑,但即使有人可以帮助我理解如何编写代码以获取除法的其余部分,那也会对我有很大帮助。

【问题讨论】:

    标签: little-man-computer


    【解决方案1】:

    我假设输出应该是一系列单位数字,以给定的基本符号表示给定的十进制数。

    您可以使用基于数据的方法:将 2、3、4、... 和 9 的所有相关幂存储在内存(邮箱)中。我们只需要不大于 999 的幂,所以这个列表是有限的:

    • 基数 2:1 2 4 8 16 32 64 128 256 512
    • 基数 3:1 3 9 27 81 243 729
    • 基数 4:1 4 16 64 256
    • 基数 5:1 5 25 125 625
    • 基数 6:1 6 36 216
    • 基数 7:1 7 49 343
    • 基数 8:1 8 64 512
    • 基数 9:1 9 81 729

    这还有一个好处是您不必执行那么多减法。想象一下当输入是 999 和以 2 为底时的区别。如果你已经有 2 的幂(最多 512),你只会做大约 9 次减法,而如果你尝试只用 2 做它,你会做数百次减法...

    因此,鉴于这些权力,在该列表中使用一个“指针”(通过自我修改代码),它将首先找到属于给定基础的权力范围, 然后会从那里得到它,从原始数字中重复减去一个幂(最大的优先)以确定每个输出数字。

    只要没有输出任何值,您就可以避免输出零。

    这是如何编码的:

    #input: 12 2
             INP          // number
             STA DECIMAL
             INP          // base
             SUB ONE
             STA BASE
    LOOPBASE LDA BASE    // count down to find powers of base
             SUB ONE
             STA BASE
             BRZ DIVIDE
    
     LOOPPOW LDA CODE1    // take next power
             ADD ONE
             STA CODE1    // self-modifying
             LDA ONE      // is it 1?
       CODE1 SUB POWER    
             BRZ LOOPBASE // yes...
             BRA LOOPPOW  // no... 
            
      DIVIDE LDA CODE1
             ADD ONE
             STA CODE2
             BRA ENTRY
            
        LOOP STA DECIMAL
             LDA DIGIT     
             ADD ONE
             STA DIGIT     
       ENTRY LDA DECIMAL
       CODE2 SUB POWER     
             BRP LOOP
             LDA FIRST   // do not output prepadded 0
             BRZ OUTPUT  // not the first digit
             LDA DIGIT
             BRZ SKIP
      OUTPUT LDA DIGIT
             OUT
             SUB DIGIT
             STA FIRST   // no longer first digit
        SKIP STA DIGIT
             LDA CODE2
             ADD ONE
             STA CODE2   // self-modifying
             STA CODE3   // self-modifying
             LDA ONE     // is power 1?
       CODE3 SUB POWER
             BRP FINISH  // yes
             BRA ENTRY
            
      FINISH LDA DECIMAL
             OUT
             HLT
             
     DECIMAL DAT
     BASE    DAT
     DIGIT   DAT
     FIRST   DAT 1
    
       POWER DAT    
             DAT 512 // powers of 2
             DAT 256
             DAT 128
             DAT 64
             DAT 32
             DAT 16
             DAT 8
             DAT 4
         TWO DAT 2
         ONE DAT 1
             DAT 729 // powers of 3
             DAT 243
             DAT 81
             DAT 27
             DAT 9
             DAT 3
             DAT 1
             DAT 256 // powers of 4
             DAT 64
             DAT 16
             DAT 4
             DAT 1
             DAT 625 // powers of 5
             DAT 125
             DAT 25
             DAT 5
             DAT 1
             DAT 216 // powers of 6
             DAT 36
             DAT 6
             DAT 1
             DAT 343 // powers of 7
             DAT 49
             DAT 7
             DAT 1
             DAT 512 // powers of 8
             DAT 64
             DAT 8
             DAT 1
             DAT 729 // powers of 9
             DAT 81
             DAT 9
             DAT 1  
    
    <script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.7/lmc.js"></script>

    这几乎使用了所有可用的邮箱。空间使用上的一些优化可能仍然是可能的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 2018-09-17
      • 2012-05-03
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      • 1970-01-01
      相关资源
      最近更新 更多