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

浙公网安备 33010602011771号