我有一个关于将两个二进制数相乘的问题。
我在 github DigiProcessor上开始了一个个人项目,因为我总是喜欢学习更多。我只是在自学一些新东西。我无法使用电路板,所以我决定尝试用 PHP 制作我的“数字电路板”。该项目目前有or
、nor
、and
、nand
、xor
和xnor
门not
。使用这些门,我创建了一个adder
包含 ahalf adder
和 a的类full adder
。
我已经建立了一个processor
类,它目前可以添加两个数组(用布尔值填充),并减去两个数组。
现在下一步是实际将两个二进制相乘。请注意,我对这个领域一无所知,仍然只是在尝试。这个也没用,其实挺没用的,就是觉得有意思。
那么应该怎么办呢?
据我所见,将乘数中的每个数字乘以乘数。在接下来的每一行中,您都使用 0 作为最后一个位置的占位符。我希望这是正确的?
0101 = 5(4 和 1)
0011x = 3(2 和 1)
__
0101 = 5(4 和 1)
1010 = 10(8 和 2)
这将导致1111
十进制的或 15。
现在有这个电路图显示了构建这个乘法器的一个很好的方法。它对and
每一位(有时xor
)使用一个门,然后基于此返回一个结果。用于此的 PHP 函数将是:
static function multiplier2bit(array $in0, array $in1, &$binString) {
$binArray = [];
$out0 = Gate::and($in0[0], $in1[0]);
array_unshift($binArray, $out0 ?: '0');
$res0 = Gate::and($in0[0], $in1[1]);
$res1 = Gate::and($in0[1], $in1[0]);
$res2 = Gate::and($in0[1], $in1[1]);
$out1 = Gate::xor($res0, $res1);
array_unshift($binArray, $out1 ?: '0');
$res3 = Gate::and($res0, $res1);
$out2 = Gate::xor($res2, $res3);
array_unshift($binArray, $out2 ?: '0');
$out3 = Gate::and($res2, $res3);
array_unshift($binArray, $out3 ?: '0');
$binString = implode('', $binArray);
}
如您所见,这是一个相当长且效率低下的函数,最多只能计算 9 个。我将如何扩展它以能够实际计算更大的数字?如果可以的话,我将如何递归地做到这一点?我不想输入一百万and
门。这甚至可能吗?电路如何处理这个问题?