如何在Python中存储无符号1024位整数并实现加法函数
实现1024位无符号大整数加法方案
核心思路
用低位在前的long数组存储大整数:1024位正好是16个64位无符号long(1024 / 64 = 16),低位存在数组下标0,高位依次往后。这种存储方式和手动加法的顺序一致,方便处理进位。
MyBigInteger类实现
public class MyBigInteger { // 存储无符号64位整数,低位在前,高位在后 private final long[] digits; // 构造方法:传入long数组(低位在前),自动去除末尾冗余0 public MyBigInteger(long[] digits) { int nonZeroEnd = digits.length - 1; // 跳过末尾的0,减少无效存储 while (nonZeroEnd >= 0 && digits[nonZeroEnd] == 0) { nonZeroEnd--; } // 处理全0的情况 if (nonZeroEnd < 0) { this.digits = new long[]{0}; } else { this.digits = new long[nonZeroEnd + 1]; System.arraycopy(digits, 0, this.digits, 0, nonZeroEnd + 1); } } // 获取内部数组的副本(避免外部修改) public long[] getDigits() { return digits.clone(); } // 静态加法方法:实现两个无符号大整数相加 public static MyBigInteger add(MyBigInteger a, MyBigInteger b) { long[] aDigits = a.digits; long[] bDigits = b.digits; int maxLength = Math.max(aDigits.length, bDigits.length); // 结果数组预留一位,处理最高位进位 long[] result = new long[maxLength + 1]; long carry = 0; for (int i = 0; i < maxLength; i++) { // 取出当前位的数,超出数组范围则取0 long x = i < aDigits.length ? aDigits[i] : 0; long y = i < bDigits.length ? bDigits[i] : 0; // 计算x+y的无符号和与进位 long total = x + y; // 无符号溢出判断:若x+y溢出有符号long,结果会是负数,小于x(x为无符号正数) long carry1 = total < x ? 1 : 0; // 加上之前的进位,再计算新的进位 total += carry; long carry2 = total < carry ? 1 : 0; carry = carry1 + carry2; // 保存当前位结果(无符号低64位) result[i] = total; } // 处理最高位的剩余进位 if (carry != 0) { result[maxLength] = carry; } return new MyBigInteger(result); } // 可选:重写toString,以十六进制打印(高位在前) @Override public String toString() { StringBuilder sb = new StringBuilder("MyBigInteger["); // 从高位到低位打印 for (int i = digits.length - 1; i >= 0; i--) { sb.append(Long.toUnsignedString(digits[i], 16)); if (i > 0) sb.append(", "); } sb.append("]"); return sb.toString(); } }
关键细节说明
- 存储顺序:低位在前是核心,这样加法从数组下标0开始,和手动加个位、十位的逻辑完全匹配,进位直接传递到下一个下标,无需反向遍历。
- 无符号进位处理:Java的long是有符号类型,但无符号加法的低64位结果和有符号加法一致。通过
total < x判断溢出(溢出后结果为负数,必然小于正数x),就能得到无符号加法的进位。 - 冗余0处理:构造方法自动去除数组末尾的0,避免结果出现无效的空元素,同时处理全0的边界情况。
测试示例
public class Main { public static void main(String[] args) { // 测试:第一个数是最低位为全1的1024位数,第二个数是1 long[] aDigits = new long[16]; aDigits[0] = 0xFFFFFFFFFFFFFFFFL; // 64位全1的无符号数 long[] bDigits = new long[16]; bDigits[0] = 1; MyBigInteger a = new MyBigInteger(aDigits); MyBigInteger b = new MyBigInteger(bDigits); MyBigInteger sum = MyBigInteger.add(a, b); System.out.println("a: " + a); System.out.println("b: " + b); System.out.println("sum: " + sum); // 输出结果的最低位为0,第二位为1,其余为0,符合预期 } }
新手拓展提示
- 如果需要支持从十进制/十六进制字符串构造
MyBigInteger,可以实现字符串到long数组的转换逻辑(核心是逐段解析字符串为无符号long)。 - 无符号大整数的减法、乘法等操作,都可以基于类似的数组遍历+进位/借位逻辑实现,注意无符号的边界判断(比如用
Long.compareUnsigned做无符号比较)。
内容的提问来源于stack exchange,提问作者Spidey Bharath
相关产品推荐
相关产品推荐

