30

计算机如何对 2 个数字进行乘法运算,例如 100 * 55。

我的猜测是计算机通过重复加法来实现乘法。当然,这可能是整数的情况。但是对于浮点数必须有一些其他的逻辑。

注意:这是在采访中提出的。

4

9 回答 9

37

重复加法将是一种非常低效的乘法方式,想象一下将 1298654825 乘以 85324154。使用二进制的长乘法会快得多。

1100100
0110111
=======
0000000
-1100100
--1100100
---0000000
----1100100
-----1100100
------1100100
==============
1010101111100

对于浮点数,使用科学计数法。

100 is 1 * 10^2 (10 to the power of 2 = 100)
55 is 5.5 * 10^1 (10 to the power of 1 = 10)

将它们相乘,将尾数相乘并加上指数

= 1 * 5.5 * 10^(2+1)
= 5.5 * 1000
= 5500

计算机使用二进制等效项来执行此操作

100 = 1.1001 * 2^6
55  = 1.10111* 2^5
-> 1.1001 * 1.10111 * 2^(6+5)
于 2010-06-17T08:36:07.533 回答
14

通常使用的方法被称为像人类一样的部分产品,因此例如拥有100*55它会做类似的事情

  100 X
   55
 ----
  500 +
 500
 ----

基本上,旧方法使用移位和累加算法,在该算法中,您保留总和,同时为第二个数字的每个数字移动部分乘积。这种方法的唯一问题是数字存储在 2-complement 中,因此您不能在移位时进行简单的 bit per bit 乘法。

如今,大多数优化都能够在 1 个周期内对所有部分求和,从而使您能够进行更快的计算和更轻松的并行化。

看看这里:http ://en.wikipedia.org/wiki/Binary_multiplier

最后,您可以找到一些实现,例如

于 2010-06-17T08:41:20.547 回答
6

一种方法是使用二进制长乘法:

       01100100 <- 100
     * 00110111 <- 55
     ----------
       01100100
      01100100
     01100100
   01100100
  01100100
---------------
  1010101111100 <- 5500

这有时称为shift 和 add方法。

于 2010-06-17T08:44:28.327 回答
5

好吧,就这样吧。我在不久前写了这篇文章(1987 年!),所以有些事情发生了变化,而其他事情保持不变......

http://moneybender.com/transactor_article.pdf

于 2010-06-21T17:23:05.053 回答
3

计算机使用布斯算法或其他算法来进行算术运算的移位和加法。如果你学过计算机架构课程,那么计算机架构方面的书籍应该是学习这些算法的好地方。

于 2010-06-17T09:19:13.893 回答
2

要将两个浮点数相乘,请使用以下过程:

  1. 将尾数相乘
  2. 添加指数
  3. 标准化结果(小数点在第一个非零数字之后)

所以,以 10 为底乘以 5.1E3 和 2.6E-2

将尾数相乘 => 5.1 * 2.6 = 13.26(注意,只要跟踪小数点的位置,就可以通过整数乘法来完成)

添加指数 => 3 + -2 = 1

给我们一个 13.26E1 的结果

标准化 13.26E1 => 1.326E2

于 2010-06-17T09:58:49.207 回答
1

直观地,您可以通过使用移位来最小化重复添加。

就浮动而言,这篇文章看起来非常相关:

http://oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter_14/CH14-1.html#HEADING1-19

于 2010-06-17T08:39:52.910 回答
1

答案是,这取决于。正如其他人指出的那样,您可以使用我们在学校教过的相同算法,但使用二进制代替。但对于少数人,还有其他方法。
假设您想将两个 8 位数字相乘,这可以通过一个大查找表来完成。您只需将两个 8 位数字连接起来形成一个 16 位数字,然后使用该数字索引到包含所有产品的表中。
或者,您可以拥有一个直接计算函数的大型门网络。但是,这些门网络对于大数的乘法往往变得相当笨拙。

于 2010-06-17T09:58:27.413 回答
1

我只是编写了一个简单的程序,使用算法长乘法将存储在文件中 2 行中的两个数字相乘。它可以相乘两个数超过10亿的数

例子:

            23958233
            5830 ×
         ------------
            00000000  ( =      23,958,233 ×     0)
           71874699   ( =      23,958,233 ×    30)
          191665864   ( =      23,958,233 ×   800)
         119791165    ( =      23,958,233 × 5,000)

源代码:

请查看并发表您的评论 http://code.google.com/p/juniormultiply/source/browse/#svn/trunk/src

于 2010-07-17T13:58:23.933 回答