Krok następny – wyliczamy wartość dla liczby „w pamięci”. Jeszcze trochę i poskładamy sobie to dodawanie za pomocą operatorów bitowych do kupy.

Ok, na czym stanęliśmy:

function binCalculateCarry(x, y) {
    return x & y;
}

console.log(binCalculateCarry(0,0)); //0
console.log(binCalculateCarry(0,1)); //0
console.log(binCalculateCarry(1,0)); //0
console.log(binCalculateCarry(1,1)); //1

Na wyliczeniu kiedy w pamięci ma być 0, a kiedy ma coś mieć (wtedy pokazuje 1). Wyliczmy sobie wartość tego „w pamięci”:

function binCalculateCarryValue(x, y){
    let carry = x & y;
    return carry << 1;
}

console.log(binCalculateCarryValue(0,0)); //0
console.log(binCalculateCarryValue(0,1)); //0
console.log(binCalculateCarryValue(1,0)); //0
console.log(binCalculateCarryValue(1,1)); //2

console.log(binCalculateCarryValue(4,4)); //8
console.log(binCalculateCarryValue(3,4)); //0

Czemu tak? Zacznijmy od 3 i 4:

0 0 1 1
0 1 0 0
--------
0 1 1 1 

Jak widać nic tu w pamięci nie wyliczamy. Ok, a 4 + 4?

8 4 2 1

0 1 0 0
0 1 0 0
--------
1 0 0 0 

No to, co było jedynką w pamięci ma wartość 8, realnie.

A 1 i 1?

0 0 0 1
0 0 0 1
-------
0 0 1 0

Tutaj przenieśliśmy w pamięci 1 ale ma ona wartość 2. Zatem 1 & 1 to 1, bit w lewo to 2.

Zauważmy też, że np. 0 & 0 to 0, 0 << 1 to nadal 0. A zabawy z przenosinami kończymy jak po lewej mamy 0. To się nam przyda do warunku kończenia, to jest:

  • dodajemy
  • wyliczamy carry
  • w pewnym momencie zostaną nam tylko dwa 0 i być może coś w pamięci
  • w pamięci ma zostać odpowiednio zamienione na wartość
  • (0 & 0) << 1 daje 0, zatem warunek idealny do wyjścia z pętli

Ale o tym w następnych lekcjach.