前两天突发奇想,写一个乘法的实现,但不用乘号*。并测试一下性能如何。因此就有了下面的代码:(本文主要目的是为了玩递归和位移,因此仅限自然数)
首先,标准乘法:
1 int commonMultiplication(int a, int b) => a * b;
第二,从数学的角度,乘法其实就是加法,只是加法的简写而已,因此 a * b 可以理解为 b 个 a 相加;故得出用加法代替的乘法。为了减少加法的次数,取 a, b 两数的最小值进行循环:
1 int plusMultiplication(int a, intb) {2 var t = a > b ? b : a, r = 0;3 if (t ==a) {4 a =b;5 b =t;6 }7
8 while (b-- > 0) r +=a;9 returnr;10 }
最后,位移乘法。计算机进行位移操作的速度是非常快的,因此,如果能把乘法换算成位移操作的话,速度会不会更快?但是根据计算机二进制的特点,每次向左位移,相当于是乘了2的n次方,怎么办?我们看看例子:
31 * 18
怎么用位移来实现呢?首先我们取小的数:18,进行拆解。拆解的算法是,任何一个自然数,在计算机中都可以用二进制表示,那么,任何一个自然数,也可以拆解为2的幂的和。比如 18 的二进制表示 为 10010,拆解成十进制,即为 18 = 16 + 2;那么上面可