Piszemy funkcję, która dodaje do siebie liczby binarne (dwójkowe) przyjmowane w postaci tekstu (jedynki i zera). Do dzieła!
Na początku zobaczmy jak wygląda sumowanie liczb dwójkowych:
0 + 1 = 1
0
1 +
-----
1
1 + 1 = 2:
1
1 +
------
1 0
Krótko mówiąc 1 + 1 to 0 i carry (w pamięci) 1. A 3 + 2?
3 + 2 = 5
0 0 1 1
0 0 1 0
-------
0 1 0 1
Nie jestem najlepszy w tłumaczeniu tego, ale sprawa wygląda tak:
- 0 + 0 i 0 w pamięci = 0
- 0 + 0 i 1 w pamięci = 1
- 1 + 0 i 0 w pamięci = 1
- 1 + 1 i 0 w pamięci = 0, 1 w pamięci
- 1 + 1 i 1 w pamięci = 1, 1 w pamięci
Możemy to sobie rozpisywać na kartce, tak długo, aż pojmiemy. Jeszcze jeden przykład, 3 + 3 (ma być 6):
3 + 3 = 6
0 0 1 1
0 0 1 1
1 + 1? 0 , 1 w pamięci:
0 0 1 1
0 0 1 1 +
-------
x x x 0
1 + 1 i 1 w pamięci? 1, 1 w pamięci:
0 0 1 1
0 0 1 1 +
-------
x x 1 0
0 + 0 i 1 w pamięci? 1, 0 w pamięci
0 0 1 1
0 0 1 1 +
-------
x 1 1 0
Ok, rozpisujemy wagi:
8 4 2 1
x 1 1 0
4 + 2 ? 6 (3 + 3)
Teraz znamy mechanizm, to jest umiemy na kartce te liczby dodawać. Pora poznać algorytm.
function addBinary(binStr1, binStr2){
let i = binStr1.length - 1;
let j = binStr2.length - 1;
let result = "";
let carry = 0;
while(i >= 0 || j >= 0 || carry === 1 ){
let sum = carry;
if(i >= 0){
sum += parseInt(binStr1[i--]);
}
if(j >= 0){
sum += parseInt(binStr2[j--]);
}
result = `${sum % 2}${result}`;
carry = Math.floor(sum / 2);
}
return result;
}
console.log(addBinary("0011", "0011"));
//0110
Czyli tak:
- idziemy od prawej po tych napisach aż którykolwiek ma jeszcze jakieś cyfry (lub nam w pamięci zostało)
- na początku wynik to pusty string
- na początku w pamięci jest 0
- za każdym razem przypisujemy do sumy to co w pamięci
- dodajemy do sumy cyfrę z pierwszego
- dodajemy do sumy cyfrę z drugiego
- dodajemy na początku napisu suma % 2 czyli:
- suma 1? cyfra 1 mod 2 czyli 1
- suma 2? cyfra 2 mod 2, czyli 0
- suma 3 (1 + 1 + 1 w pamięci)? cyfra 3 mod 2, czyli 1
- przygotuwujemy carry, czyli suma / 2 bez reszty czyli:
- suma 1? w pamięci 1/2 czyli 0
- suma 2? w pamięci 2/2 czyli 1
- suma 3? w pamięci 3/2 czyli 1
Generalnie tak to wygląda.