乘以加法

时间:2011-04-27 17:18:08

标签: php

我读了一个维基,上面写着CPU增加的倍增!

来自wiki:

Pass the only weight-1 wire through, output: 1 weight-1 wire
Pass the two weight-2 wires through, outputs: 2 weight-2 wires
Add a full adder for weight 4, outputs: 1 weight-4 wire, 1 weight-8 wire
Add a full adder for weight 8, and pass the remaining wire through, outputs: 2 weight-8 wires,     1 weight-16 wire
Add a full adder for weight 16, outputs: 1 weight-16 wire, 1 weight-32 wire
Pass the two weight-32 wires through, outputs: 2 weight-32 wires
Pass the only weight-64 wire through, output: 1 weight-64 wire

我不明白整个,但我认为如果它不知道如何添加传递并继续添加,那么它会不断添加。这里全文:http://en.wikipedia.org/wiki/Dadda_tree

我做了很多研究,我觉得它很慢。因此,我不想让CPU进行乘法,而是想自己做。

我写了这个函数:

function do_multiply($a, $b)
{
    while($b > 0) { 
        $a = $a + $a;
        $b = $b-1;
}

我想要做的就是如果我要求函数乘以2和3,我想加2到3,三次,对吗?

所以我想这样做:

2+2+2

这与2 * 3相同,是吗?

当我跑这个时,它给了我16.为什么我得到了错误的答案?

4 个答案:

答案 0 :(得分:6)

  

为什么它不起作用?

假设该问题与此代码有关:

function do_multiply($a, $b)
{
    while($b > 0) { 
        $a = $a + $a;
        $b = $b-1;
}

...然后我可以立即看到三个原因:

  1. 您永远不会返回值
  2. 如果$b为负数,那么该函数将需要时间才能完成,并且它会返回错误的答案(因为您正在减去1来自$b;你需要处理$b 已经否定的情况,可能是abs - 请务必阅读乘法结果负数)。
  3. 您需要按照输入功能时添加$a ,而不是在每次传递时加倍。请考虑:从$a = 3开始,$b = 2。在第一个循环中,您设置$a = $a + $a,因此它变为6。但是在第二个循环中,您再次将$a添加到$a6 + 6),而不是添加3({{1} } 原始值)到$a

答案 1 :(得分:5)

看看你的循环,你正在增加$ a错误;

第一次迭代: $ a = 2 + 2(所以$ a = 4)

第二次迭代

$ a = 4 + 4(所以$ a = 8)

第三次迭代

$ a = 8 + 8

你需要在循环之外声明一个变量,然后添加它。

$ total = $ total + $ a

答案 2 :(得分:0)

function do_multiply($a, $b)

{

$res = 0;
while($b > 0) { 
    $res += $a;
    $b = $b-1;
}
return $res;

}

答案 3 :(得分:0)

假设$a为2且$b为3,就像你建议的那样,那么你的代码将运行while循环3次(也就是迭代),我认为这是你所期望的。 / p>

但是,在while循环期间,您可以使用赋值运算符更改$a的值。这会给你带来麻烦,因为你的函数背后的想法依赖于$a保持其原始价值。这就是为什么你需要有第三个“结果”容器来存储迭代过程中的临时结果。