我读了一个维基,上面写着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.为什么我得到了错误的答案?
答案 0 :(得分:6)
为什么它不起作用?
假设该问题与此代码有关:
function do_multiply($a, $b)
{
while($b > 0) {
$a = $a + $a;
$b = $b-1;
}
...然后我可以立即看到三个原因:
$b
为负数,那么该函数将需要长时间才能完成,并且它会返回错误的答案(因为您正在减去1
来自$b
;你需要处理$b
已经否定的情况,可能是abs
- 请务必阅读乘法结果负数)。$a
,而不是在每次传递时加倍。请考虑:从$a
= 3
开始,$b
= 2
。在第一个循环中,您设置$a = $a + $a
,因此它变为6
。但是在第二个循环中,您再次将$a
添加到$a
(6
+ 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
保持其原始价值。这就是为什么你需要有第三个“结果”容器来存储迭代过程中的临时结果。