我读了一个维基说,为CPU增加倍增!
来自维基:
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
Run Code Online (Sandbox Code Playgroud)
我不明白整个,但我认为如果它不知道如何添加传递并继续下一步,它会不断添加.这里全文:http://en.wikipedia.org/wiki/Dadda_tree
我做了很多研究,我觉得它很慢.因此,我不想让CPU进行乘法运算.
我写了这个函数:
function do_multiply($a, $b)
{
while($b > 0) {
$a = $a + $a;
$b = $b-1;
}
Run Code Online (Sandbox Code Playgroud)
我想要做的就是如果我要求函数乘以2和3,我想加2到3,三次,对吗?
所以我想这样做:
2+2+2
Run Code Online (Sandbox Code Playgroud)
这与2*3相同,对吗?
当我运行它时它给了我16.为什么我得到了错误的答案?
为什么它不起作用?
假设该问题与此代码有关:
function do_multiply($a, $b)
{
while($b > 0) {
$a = $a + $a;
$b = $b-1;
}
Run Code Online (Sandbox Code Playgroud)
......那么我可以立即看到三个原因:
$b是否定的,那么,这个函数的要花费很长的时间才能完成,而且它会返回错误的答案(因为你减去1的$b,你需要处理其中的情况$b是已经否定,可能与abs-一定阅读乘以负数的结果).$a 在进入函数时添加,而不是在每次传递时加倍.考虑:从$a= 3,$b=开始2.在第一个循环中,您正在设置$a = $a + $a,因此它变为6.但随后在第二循环中,要添加$a到$a试(6+ 6),而不是添加3($a的原始值)$a.看看你的循环,你正在增加$ a错误;
第一次迭代:$ a = 2 + 2(所以$ a = 4)
第二次迭代
$ a = 4 + 4(所以$ a = 8)
第三次迭代
$ a = 8 + 8
您需要在循环外声明一个变量并添加到该变量.
$ total = $ total + $ a