0

我有一个关于将两个二进制数相乘的问题。

我在 github DigiProcessor上开始了一个个人项目,因为我总是喜欢学习更多。我只是在自学一些新东西。我无法使用电路板,所以我决定尝试用 PHP 制作我的“数字电路板”。该项目目前有ornorandnandxorxnornot。使用这些门,我创建了一个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。

现在有这个电路图2 位乘 2 位二进制乘法器显示了构建这个乘法器的一个很好的方法。它对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门。这甚至可能吗?电路如何处理这个问题?

4

0 回答 0