FDBigInteger中的mult个人理解

 1     private final static long LONG_MASK = 0xffffffffL;
 2     private static void mult(int[] s1, int s1Len, int[] s2, int s2Len, int[] dst) {
 3         for (int i = 0; i < s1Len; i++) {
 4             long v = s1[i] & LONG_MASK;
 5             long p = 0L;
 6             for (int j = 0; j < s2Len; j++) {
 7                 p += (dst[i + j] & LONG_MASK) + v * (s2[j] & LONG_MASK);
 8                 dst[i + j] = (int) p;
 9                 p >>>= 32;
10             }
11             dst[i + s2Len] = (int) p;
12         }
13     }

举例说明:

99*67

 

上面是没经加法算出的,假设int范围为<10,那么63的6为溢出值,这时需要无符号位移>>>将long的高位降低成int,这时第二次小循环时就会变成计算63+6

这就是为什么p>>>=32;

dst[i + s2Len] = (int) p;同理

LONG_MASK是为了让int变成long的,FFFFFFFF在int类型中是负数,而long中等于4294967295


posted @ 2022-01-17 00:23  pylq  阅读(162)  评论(0)    收藏  举报