小编典典
让我们开始看乘法代码。这个想法实际上很聪明。假设您有以二进制形式编写的n 1和n 2。然后,您可以将n1视为两个幂的和:n2 = c 30 2 30 +
c 29 2 29 + … + c 1 2 1 + c 0 2 0,其中每个c i为0或1。那么您可以将乘积n 1 n 2视为
n 1 n 2 =
n 1(c 30 2 30 + c 29 2 29 + … + c 1 2 1 + c 0 2 0)=
n 1 c 30 2 30 + n 1 c 29 2 29 + … + n 1 c 1 2 1 + n 1 c 0 2 0
这有点密集,但是我们的想法是,两个数字的乘积由第一个数字乘以组成第二个数字的两个数字的乘方乘以第二个数字的二进制数字的值得出。
现在的问题是,我们是否可以在不进行任何实际乘法的情况下计算该和项。为了做到这一点,我们将需要能够读取n
2的二进制数字。幸运的是,我们可以使用班次进行操作。特别地,假设我们从n 2开始,然后只看最后一位。那是c 0。如果然后将值下移一个位置,则最后一位是c
0,依此类推。更一般而言,将n 2的值下移i个位置后,最低位将是c
i。要读取最后一位,我们可以对值与数字1进行按位与运算。它具有二进制表示形式,除最后一位数字外,其他所有位置均为零。由于任何n的0 AND n =
0,因此将清除所有最高位。此外,由于0 AND 1 = 0和1 AND 1 = 1,因此此操作将保留数字的最后一位。
好的-我们现在知道我们可以读取