Ocena użytkownikóww: ***** / 2
Nadesłany przez ejaszke, 01 kwietnia 2017 23:59
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
abs.js:
// Funkcja oblicza wartosc bezwzgledna z podanej liczby
// Wykorzystano fakt, ze liczby w komputerze przechowywane sa
// w kodzie uzupelnien do dwoch, w ktorym aby zamienic liczbe na przeciwna,
// nalezy wykonac dwa kroki:
// 1. Dokonac inwersji bitów, czyli zamienić 0 na 1 i odwrotnie;
// 2. Ziekszyc wynik o 1.
// Algorytm dzialania funkcji jest nastepujacy
// - najpierw podana liczba jest przesuwana w prawo (z zachowaniem znaku) o 31 bitow,
// dla 32 bitowych liczba wynik takiego dzialania bedzie nastepujacy:
// * 0 dla zera i wszystkich liczb dodatnich
// * -1 dla wszystkich liczb ujemnych
// - nastpenie zadana liczba jest xor'owana z obliczona maska:
// * dla liczb dodatnich wynikiem jest ta sama liczba dodatnia (bo xor z 0 nic nie zmienia)
// * dla liczb ujemnych xor'ujemy z liczba -1, ktora reprezentowana jest bitowo przez 0xFFFFFFFF (wszystkie bity wlaczone)
// to powoduje odwrocenie wszystkich bitow w podanej liczbie, w wyniku czego otrzymujemy liczbe dodatnia o jeden mniejsza
// - nastapnie odejmujemy obliczona maske od wyniku:
// * dla liczb dodatnich wynikiem jest ta sama liczba bo maska jest rowna 0
// * dla liczb wartosci ujemnej maska jest rowna -1 wiec do wyniku z poprzedniego kroku dodajemy 1 i otrzymujemy wartosc bezwezgledna
// www.algorytm.org
const abs = number => {
const mask = number >> 31 //przesuniecie liczby o 31 bitow w prawo z zachowaniem znaku
return (number ^ mask) - mask
}
console.log(abs(-1))