2009-06-25 4 views
6

mi sono imbattuto in questo in qualche AS Codice 3.0:AS3 spostamento bit a bit 0?

(duration >> 0) 

Dove durata è un Number. Penso di sapere cosa fa un bitwise right shift, ma qual è il punto di spostamento di 0 bit? Succede alcune volte nel codice, mi piacerebbe capire cosa fa.

+0

Suppongo che alcuni indovinino come codificare, semplicemente martellando ciò che funziona :( – leppie

+0

se si mostrano alcune delle linee intorno avremo più da indovinare. – grapefrukt

risposta

8

ci sono un paio di ragioni per questo ..

In primo luogo, la moltiplicazione e la divisione è in realtà più veloce in alcune circostanze quando usiamo spostamento a sinistra, spostamento a destra ...

cioè il numero 1 in binario è 00000001 spostarlo a sinistra per diventare 00000010 ed è ora 2 .. cioè 1 x 2

Maiusc due volte per moltiplicare/divisione da 4, 3 volte per 8, 4 volte per 16, ecc ...

Non viene utilizzato troppo frequentemente, ma in casi come una porta del motore fisico da C/C++, l'elaborazione di grandi quantità di dati, o alcuni dei Motori 3d, vedremo i cambiamenti come un residuo del codice originale, o semplicemente per la velocità.

(Si potrebbe vedere anche su alcuni java mobili J2ME, ad esempio, dove le unità in virgola mobile non sono disponibili, ovvero spostare un valore di 10 bit in modo che i restanti 10 bit agiscano come una sorta di punto decimale .. quindi spostare indietro per il valore reale quando si disegna nella posizione dello schermo, al costo della dimensione complessiva possibile)

L'altro uso come menzionato è per un rapido Math.floor(); - ma con una differenza di chiave. Ho fatto alcuni benchmark di qualche mese prima di lavorare con Box2D e l'ho trovato centinaia di volte più veloce - strano dal momento che presumo che entrambe le conversioni siano gestite in modo nativo.

Quando arrotondamento numeri negativi,
Math.floor (-7,6) = -8 e (-7.6 < < 0) = -7

I.e. < < 0 su un numero (float) si arrotonda nella direzione di 0.

3

A volte si vedrà questo in un enum solo per completezza, vale a dire

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

e così via. Se vi imbattete in questo codice, mi aspetterei che siano solo alcuni residui da quando in realtà c'era più da spostare (test, requisiti modificati). Ovviamente, a meno che questo operatore non sia un operatore di turno in AS3. In C++, ad esempio, viene anche utilizzato come operatore di input stream (lo sai, perché stai spostando qualche input in qualche variabile. Sigh).

+1

>> è sicuramente un operatore di bitshift in AS3 –

+0

Intendevi a sinistra ('<<')? – Tim

+1

@Tim Nordenfur: avrebbe più senso, non sarebbe? Ma poi, la domanda riguardava '>>';) – OregonGhost

4

Potrebbe essere un trucco per sbarazzarsi dei decimali senza il sovraccarico di una chiamata a Math.floor() poiché anche con un numero come input si otterrà un intero di nuovo.

io non sono sicuro di come questo confronto le prestazioni saggio fare una (più comunemente visto) Cast a int (x)