如何实现两个大型二进制字符串相加?Java是否有内置函数可用?
问题分析与解决方案
错误原因
你用Integer.parseInt()处理大型二进制字符串时出错,核心原因是Integer类型的范围限制:Java的int是32位有符号整数,最大值为2^31-1(对应二进制31位),当二进制字符串长度超过31位时,转换会直接抛出NumberFormatException,或者因溢出得到错误结果。
解决方案
方案一:使用BigInteger(Java内置方案)
Java的java.math.BigInteger类专门用于处理任意大小的整数,完全适配超长二进制字符串的需求。它提供了直接解析二进制字符串、执行加法、转换回二进制字符串的方法,代码简洁高效:
class Solution { public String addBinary(String a, String b) { BigInteger numA = new BigInteger(a, 2); BigInteger numB = new BigInteger(b, 2); BigInteger sum = numA.add(numB); return sum.toString(2); } }
方案二:手动实现二进制加法(底层逻辑实现)
如果不想依赖BigInteger,可以模拟竖式加法的过程,从两个字符串的末尾逐位计算,处理进位:
class Solution { public String addBinary(String a, String b) { StringBuilder result = new StringBuilder(); int i = a.length() - 1; int j = b.length() - 1; int carry = 0; // 循环处理所有位,直到没有剩余位且无进位 while (i >= 0 || j >= 0 || carry != 0) { // 获取当前位的数值,超出范围则取0 int digitA = i >= 0 ? a.charAt(i) - '0' : 0; int digitB = j >= 0 ? b.charAt(j) - '0' : 0; // 计算当前位总和 int total = digitA + digitB + carry; // 当前位结果取模2 result.append(total % 2); // 更新进位 carry = total / 2; // 指针左移 i--; j--; } // 因为是从末尾开始添加,需要反转得到正确顺序 return result.reverse().toString(); } }
方案选择
- 优先用
BigInteger:代码简洁,无需手动处理进位,适合大多数场景; - 手动实现:适合理解二进制加法的底层逻辑,或者在禁止使用
BigInteger的场景下使用。
内容的提问来源于stack exchange,提问作者Sai Krishna
相关产品推荐
相关产品推荐

