二进制加法
二进制加法
问题重述:
给定两个 01 字符串 a
和 b
,请计算它们的和,并以二进制字符串的形式输出。
输入为 非空 字符串且只包含数字 1
和 0
。
示例 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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】