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.