求两个二进制的和

本文介绍了两种方法计算给定两个二进制字符串的和:一种是将数字转换为十进制相加再转回二进制,另一种则是直接模拟竖式加法,逐位处理。后者解决了大数溢出问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求二个二进制的和: 给你两个二进制字符串 ab ,以二进制字符串的形式返回它们的和。

/*
 * 注意:a 和 b 仅由字符 '0' 或 '1' 组成
 *  
 * 示例 1:
 * 		输入:a = "11", b = "1"
 * 		输出:"100"
 * 示例 2:
 * 		输入:a = "1010", b = "1011"
 * 		输出:"10101"
 */

思路:

思路一:我们首先想到的就是先将两个二进制转换为十进制求和,求得结果后,再将结果转换为二进制返回
思路二:上面的方法简单易懂,但存在的问题就是当数值太大超出int范围时,就会出错。所以我们模仿小学学的列竖式计算,将a,b右端 对齐,做加法,逢2进1,直到结束

思路二解析图: 

核心代码: 

 思路一:
public class BinarySystem {
    // 求二个二进制的和: 给你两个二进制字符串 `a` 和 `b` ,以二进制字符串的形式返回它们的和。
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入a的值:");
        String a = sc.next();
        System.out.println("请输入b的值");
        String b = sc.next();
        System.out.println(addBinary(a,b));
    }

    public static String addBinary(String a, String b) {
       // 定义变量保存结果
        String result = "";
        // 定义保存二进制转十进制的数
        int numberA = Integer.parseInt(a,2);
        int numberB = Integer.parseInt(b,2);
        // 定义变量保存a+b的和用于计算二进制
        int sum = numberA + numberB;
        while (sum != 0) {
            result = sum % 2 + result; // 把余数放在前面
            sum = sum / 2; // 把商作为新的被除数
        }
        return result;
    }
}

可简化为:

public class BinarySystem {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入a的值:");
        String a = sc.next();
        System.out.println("请输入b的值");
        String b = sc.next();
        System.out.println(addBinary(a,b));
    }
    public static String addBinary(String a, String b) {
        // Integer.parseInt(a,2) 把二进制的数转为十进制  参数一:目标值 参数二:需要转换进制的类型 可不写 不写默认转为十进制的数
        // Integer.toBinaryString() 把整数转为二进制的字符串
        return Integer.toBinaryString(Integer.parseInt(a,2) + Integer.parseInt(b,2));
    }
思路二:
public class BinaryNumber {
    public static void main(String[] args) {
        System.out.println(addBinary("11", "1"));
        System.out.println(addBinary("101" , "10"));
    }
    public static String addBinary(String a, String b) {
        StringBuilder sb = new StringBuilder();
        // 获取输入内容的最后一项
        int i = a.length() - 1;
        int j = b.length() - 1;
        //保存进位
        int carry = 0;
        // 循环遍历,从右往左进行遍历
        while (i >= 0 || j >= 0 || carry != 0) {
            // 依次获取i和j对应的数 将字符串数字转为整数数字
            int aNum = (i >= 0) ? a.charAt(i--) - '0' : 0;
            int bNum = (j >= 0) ? b.charAt(j--) - '0' : 0;
            // 相加的和
            carry = aNum + bNum + carry;
            // 记录结果 c = 2 % = 0(进位); c = 1 % 2 = 1; c = 0 % c = 0;
            sb.append(carry % 2);
            // 是否进位 c = 2 / 2 = 1(进位); c = 1 / 2 = 0 ; c = 0 / 2 =0;
            carry /= 2;
        }
        return sb.reverse().toString();  // 反转
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值