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.