要求:
- @input String a 字符串形式的二进制数
- @input String b 字符串形式的二进制数
- @output String c 字符串形式的二进制数,为a+b数值之和
思路:
将 a,b转换成数组,从最后一位向前逐步将a[index],b[index]放入一个半加器,半加器输入a,b,和一个进位输入carry,输出a+b+carry之和和一个进位输出,进位输出将成为下一轮进位输入,直至遍历完全部a,b.
代码:
var addBinary = function(a, b) {
// 进位符号
var carry = '0'
var alength = a.length
var blength = b.length
//每次的输入a与b
var inputa = ''
var inputb = ''
var res = []
// 获取b与a中最大的长度
var length = Math.max(alength,blength)
//从各字符串的length-1即最后一位执行加法,循环至0结束
for(var i = 1; i < length+1; i++){
//在a或者b其中一个已经循环完的情况下,如果进位也为0,提前结束循环,把未循环完剩下的字符直接拼接到res上
if((alength-i<0||blength-i<0) && carry==='0') {
alength-i<0?res.push(b.substr(0,blength-i+1)):res.push(a.substr(0,alength-i+1))
break
}
//令半加器的输入为当前字符,如果循环完,设输入为0
inputa = a[alength-i] ||'0'
inputb = b[blength-i] ||'0'
//半加器
switch(inputa+inputb+carry){
case '111':
res.push('1')
carry = '1'
break
case '011':
case '110':
case '101':
res.push('0')
carry = '1'
break
case '001':
case '010':
case '100':
res.push('1')
carry = '0'
break
case '000':
res.push('0')
carry = '0'
break
}
}
//循环完还有进位未处理把进位添加到结果
if(carry==='1') res.push('1')
return res.reverse().join('')
};