一、问题描述
输入两个表示二进制的字符串,请计算它们的和,并以二进制字符串的形式输出。例如,输入的二进制字符串分别是"11"和"10",则输出"101"。
二、问题分析
计算二进制加,1+0=1 0+0=0 1+1=10,题目没有限制字符串长度,不能使用字符串转换为整数计算,会溢出;
关键处理好进位;
三、代码实现
/** * * @param str1 加数1 * @param str2 加数2 * @return */ public static String addBinary(String str1, String str2) { StringBuffer res = new StringBuffer(); //索引从0开始,最大索引为字符串长度减一 int i = str1.length() - 1; int j = str2.length() - 1; //初始化进位 int carry = 0; //遍历字符串 while (i >= 0 || j >= 0) { //如果索引大于0,获取索引位置的字符串,并将索引--,负责用0补齐 int digit1 = i >= 0 ? str1.charAt(i--) - '0' : 0; int digit2 = j >= 0 ? str2.charAt(j--) - '0' : 0; //获取索引位置两数和进位的和; int sum = digit1 + digit2 + carry; //和为2、3时,进位 carry = sum >= 2 ? 1 : 0; //和大于2时,减去进位代表的数值 sum = sum >= 2 ? sum-2 : sum; res.append(sum); } //检查进位是否为1, if(carry==1){ //追加进位 res.append(1); } //翻转字符串 return res.reverse().toString(); }
四、测试
System.out.println(addBinary("11","11")); //110 System.out.println(addBinary("10111","1")); //11000 System.out.println(addBinary("1","10111011")); //10111100