二进制数的快速除法算法

时间:2013-10-22 21:32:33

标签: algorithm binary logic division

我目前正在使用Logisim构建一个16位ALU(即仅限逻辑门),并且我被困在一个除法过程中。我目前只使用简单的标准“除法算法循环”(如下所示):

  
      
  1. 读取输入值;
  2.   
  3. 比较输入值。等到比较过程结束;
  4.   
  5. 如果A< B转到步骤10.如果A≥B,转到下一步;
  6.   
  7. 从A中减去B;
  8.   
  9. 等到减法过程结束;
  10.   
  11. 添加一个来计算;
  12.   
  13. 等到计数过程结束;
  14.   
  15. 从减法过程写入值到输入;
  16.   
  17. 转到第1步;
  18.   
  19. 答案是数余数A
  20.   

然而,这对于具有大答案的过程需要很长时间(重复300个刻度循环65,000次并不好玩)。 我只是想知道是否有类似的算法可以使用逻辑门实现更快(专门使用加法和/或减法和/或乘法以及任何布尔逻辑)。 任何帮助或想法将不胜感激! 弗雷泽

2 个答案:

答案 0 :(得分:3)

使用long-division。在二进制中,没有乘法,因为每个位位置的商只能是1或0.所以它可以实现为条件减法(如果结果非负则减去)和移位。

当然,这只是一个粗略的轮廓。

答案 1 :(得分:2)

32/16:16 + 16除法的典型方法是将被除数存储在一对16位寄存器中(在运算期间得到更新)和除数存储在自己的寄存器中(不是)。十六次,从除数中减去被除数的高17位;如果借用结果,丢弃结果并将除数移到一个位置,将0放入lsb。如果没有借位结果,将结果存储到除数中,同时向左移动,但将1放入lsb。在十六个这样的步骤之后,被除数寄存器的低16位将保持商,高16位将保持余数。请注意,只有当商可以16位表示时,此操作才有效。还要注意,在以这种方式实现32/16:16 + 16除法的处理器上,可以方便地将任意大数除以16位数,因为每一步的被除数的高16位应该是来自上一步。