二进制加法

二进制加法

问题重述:

给定两个 01 字符串 ab ,请计算它们的和,并以二进制字符串的形式输出。

输入为 非空 字符串且只包含数字 10

示例 1:

输入: a = "11", b = "10"
输出: "101"

示例 2:

输入: a = "1010", b = "1011"
输出: "10101"

问题分析:

二进制数可能超过计算机的存储范围,所以我们不能使用位运算,我们可以在字符串上对每一位进行计算,然后计算进位,保存每一位的结果,最后将结果整合返回

解法:

字符串转换、位运算

解题:

代码:
public static String binaryAdd(String a,String b) {
    	// 定义一个字符串缓冲区,用于保存最终结果
    	StringBuffer res = new StringBuffer();
    	// 定义两个字符串缓冲区,将a和b反转(因为我们进位是从低位往高位进位)
    	StringBuffer aStr = new StringBuffer(a).reverse();
    	StringBuffer bStr = new StringBuffer(b).reverse();
    	// 定义一个长度变量,便于进行加法运算
    	int len = a.length() > b.length() ? a.length() : b.length();
    	// 接下来进行循环,对字符串的每一个位置的二进制数进行加法运算,我们还需要使用一个carry变量来作为中间结果
    	int carry = 0;
    	for(int i = 0;i < len;i++){
            // i<len代表,此时对应位置上应该是有值的,如果大于的话说明对应位置上是0,我们得到的是一个字符,如果我们希望得到对应的数字,需要使用asscii码将他转化为数字
            carry += (i < len ? aStr.charAt(i)-'0':0);
            carry += (i < len ? bStr.charAt(i)-'0':0);
            // 此时的carry是当前位上的加法和,我们将其对2求模就是加法后对应位置应该的数值
            res.append((char)(carry%2 + '0'));
            // 对carry进行处理,因为是二进制所以除以2,如果是十进制就除以10
            carry /= 2;
        }
    	//循环结束后,res中保存的是二进制加法计算的结果,从前往后是低位到高位,但是需要考虑,carry可能最后还有进位,所以我们要进行判断
    	if(carry > 0){
            res.apprnd('1');
        }
    	res.reverse();
    	return res.toString();
	}

代码解析:这道题的重点在于将char性转化为数字进行计算,因为计算机中的字符都是按照asscii码,所以我们的char型-'0'就是当前字符对应的数字,将当前数字加上‘0’就是当前数字的字符型。还有需要注意的就是,最后加完之后需要注意进位,如果有进位就在字符串上添加进位。

总结:

在进行加法运算的时候,如果加的数字或者结果大于计算机能够保存的最大数字,那么我们需要将数字转化为String型,然后通过字符串表示加法的结果。

如果相加的二进制数一定能够被计算级保存,我们可以使用位运算进行相加

public static int addBinary(int a,int b){
    int sum=a^b;
    int carry=(a&b)<<1;
    while(carry != 0){
        // 异或进行的是无进位加法
        sum = a^b;
        // 这里得到的是进位
        carry = (a&b)<<1;
        a = sum;
        b = carry;
    }
    return sum;
}
posted @   foldn  阅读(443)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示