2009-06-25 9 views
6

natknąłem to w niektórych jako kod 3,0:AS3 przesunięcie bitowe 0?

(duration >> 0) 

Jeżeli czas trwania jest Number. Myślę, że wiem, co robi bitwise right shift, ale jaki jest sens przesuwania 0 bitów? Zdarza się to kilka razy w kodzie, chciałbym zrozumieć, co robi.

+0

Chyba trochę się zgadywania, jak kod, tylko młotkiem w co działa :( – leppie

+0

jeśli pokazać niektóre linie wokół będziemy mieli więcej zgadnąć z. – grapefrukt

Odpowiedz

8

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.

3

Czasami można zobaczyć w enum tylko pod względem kompletności, czyli

flag0 = 1 >> 0, 
flag1 = 1 >> 1, 
flag2 = 1 >> 2 

i tak dalej. Jeśli napotkasz to w kodzie, spodziewam się, że to tylko niektóre z pozostałości, kiedy faktycznie było więcej do zmiany (testowanie, zmienione wymagania). Jest tak, oczywiście, chyba że ten operator nie jest operatorem zmiany w AS3. W C++, na przykład, jest również używany jako operator strumienia wejściowego (wiesz, ponieważ przenosisz jakieś wejście do jakiejś zmiennej.

+1

>> jest zdecydowanie bitshift operatora w AS3 –

+0

Czy chodziło Ci o przesunięcie w lewo ('<<')? – Tim

+1

@Tim Nordenfur: Miałoby to więcej sensu, prawda? Ale wtedy pytanie dotyczyło '>>';) – OregonGhost

4

To może być sztuczka, aby pozbyć się liczb dziesiętnych bez obciążenia związanego z Math.floor(), ponieważ nawet z liczbą jako dane wejściowe otrzymasz liczbę całkowitą z powrotem.

Nie jestem pewien, w jaki sposób ten porównuje wydajność mądry robi (częściej postrzegane) oddanych do int (x)