要求:
- @input String a 字符串形式的二進制數(shù)
- @input String b 字符串形式的二進制數(shù)
- @output String c 字符串形式的二進制數(shù)囤攀,為a+b數(shù)值之和
思路:
將 a,b轉(zhuǎn)換成數(shù)組,從最后一位向前逐步將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即最后一位執(zhí)行加法矗钟,循環(huán)至0結(jié)束
for(var i = 1; i < length+1; i++){
//在a或者b其中一個已經(jīng)循環(huán)完的情況下,如果進位也為0嫌变,提前結(jié)束循環(huán)吨艇,把未循環(huán)完剩下的字符直接拼接到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
}
//令半加器的輸入為當(dāng)前字符,如果循環(huán)完腾啥,設(shè)輸入為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
}
}
//循環(huán)完還有進位未處理把進位添加到結(jié)果
if(carry==='1') res.push('1')
return res.reverse().join('')
};