Istnieje kilka powodów ..
Po pierwsze, mnożenie i dzielenie jest rzeczywiście szybciej w pewnych okolicznościach gdy używamy przesunięcie w lewo, przesunięcie w prawo ...
czyli numer 1 w binarne 00000001 Przesunięcie go w lewo, aby stać 00000010 i to teraz 2 .. czyli 1 x 2
Przesunięcie go dwukrotnie, aby mnożyć/dzielić o 4, 3 razy dla 8, 4 razy dla 16, itd ...
To nie jest używane zbyt często, ale w przypadkach takich jak port silnika fizyki z C/C++, przetwarzanie ogromnych ilości danych lub niektóre z nich Silniki 3d, zobaczymy zmiany jako resztę oryginalnego kodu lub po prostu dla prędkości.
(Można to również zobaczyć w niektórych grach J2ME na urządzenia mobilne java, na przykład tam gdzie jednostki zmiennoprzecinkowe nie są dostępne, tzn. Przesuwają wartość o 10 bitów, tak aby pozostałe 10 bitów działało jak rodzaj przecinka dziesiętnego .. następnie przesunięcie wraca do rzeczywistej wartości podczas rysowania do pozycji ekranu, kosztem całkowitego możliwego rozmiaru).
Inne zastosowanie, jak wspomniano, dotyczy szybkiego Math.floor(); - ale z kluczową różnicą. Zrobiłem kilka benchmarków kilka miesięcy temu pracując z Box2D i znalazłem to setki razy szybciej - dziwne, ponieważ zakładam, że obie konwersje są obsługiwane natywnie.
Przy ścinaniu ujemnych wartości,
Math.floor (-7,6) = -8 i (-7.6 < < 0) = -7
tj. < < 0 na numer (float) będzie runda w kierunku 0.
Chyba trochę się zgadywania, jak kod, tylko młotkiem w co działa :( – leppie
jeśli pokazać niektóre linie wokół będziemy mieli więcej zgadnąć z. – grapefrukt