algorytm.org

Implementacja w JavaScript

Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Wartość bezwzględna - Implementacja w JavaScript
Ocena użytkownikóww: *****  / 1
SłabyŚwietny
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))

Dodaj komentarz