2012-05-02 12 views
11

Ho visto questo in un certo codice JS:Cosa fanno gli operatori ">>" (doppia freccia) e "|" (single pipe) significa in JavaScript?

 index = [ 
      ascii[0] >> 2, 
      ((ascii[0] & 3) << 4) | ascii[1] >> 4, 
      ((ascii[1] & 15) << 2) | ascii[2] >> 6, 
      ascii[2] & 63 
     ]; 

mi piacerebbe piace molto sapere quello che un sacco di questo mezzo. Specificamente ">>", un singolo tubo "|" e il simbolo "&" sull'ultima riga?

Molto apprezzato!

+3

Operatori binari. – Pointy

+1

(-1) Ricerca "Operatori JavaScript" ... -1 perché questa è prontamente disponibile, le informazioni * e * sono già state trovate troppo spesso su StackOverflow. –

+2

http://stackoverflow.com/questions/6194950/single-pipe-in-javascript, http://stackoverflow.com/questions/6997909/what-do-and-mean-in-javascript –

risposta

16

x >> y significa spostare i pezzi di x da y posti a a destra (<< a sinistra).

x | y mezzi per confrontare i bit di x e y, mettendo un 1 in ogni bit se uno o xy ha una 1 in quella posizione.

x & y è uguale a |, eccetto che il risultato è 1 se entrambi x e y hanno un 1.

Esempi:

#left-shifting 1 by 4 bits yields 16 
1 << 4 = b00001 << 4 = b10000 = 16 

#right-shifting 72 by 3 bits yields 9 
72 >> 3 = b1001000 >> 3 = b1001 = 9 

#OR-ing 
8 | 2 = b1000 | b0010 = b1010 = 10 

#AND-ing 
6 & 3 = b110 & b011 = b010 = 2 

Per ulteriori informazioni, search Google for "bitwise operators".

+0

Un po 'più dettagliato [ spiegazione] (http://digitalfortress.tech/js/double-arrow-js-bitwise-operator/) nel caso in cui non sei ancora abbastanza convinto. –

7

>> è uno spostamento bit a bit destro. Prende i bit e li sposta a destra n posti . Per esempio, esaminiamo 35 >> 2:

35 = 100011 shift two places 
    001000 = 8 

E in effetti, 35 >> 2 == 8.


| è un OR bit a bit. Prende ogni bit in ogni operando e OR insieme. Puoi immaginarlo come una sorta di aggiunta binaria, ma non lo porti quando sia la parte superiore che quella inferiore sono 1. Ad esempio, ecco 5 | 3:

5 = 101 
3 = 011 
| ----- 
    111 = 7 

E in effetti, 5 | 3 == 7.


Infine, & è un AND bit per bit. Prende ogni bit in ogni operando, tranne che invece di dare 1 se uno o l'altro o l'altro è uno, dà 1 se un bit E l'altro sono entrambi uno. Ad esempio, ecco lo 5 & 3:

5 = 101 
3 = 011 
& ----- 
    001 = 1 

Provalo; 5 & 3 == 1.


Alcuni altri quelli che si potrebbe desiderare di essere a conoscenza di sono <<, che è uno spostamento bit a bit a sinistra, e ^, che è un XOR (0 quando entrambi i bit sono uguali, 1 se sono differenti) .

In realtà, è n modulo 32. 1 >> 32 è 1. Non so perché.

+1

Grazie per una risposta utile, non irritante. – Ashe

+0

Questa dovrebbe essere la risposta esclusa! grande spiegazione – DoubleA

1
  • & (AND bit a bit)
  • | (OR bit per bit)
  • < < (spostamento a sinistra)
  • >> (Sign-moltiplicazione spostamento a destra)

esempi (da https://developer.mozilla.org/en/JavaScript/Reference/Operators/Bitwise_Operators):

bit a bit e:

 9 (base 10) = 00000000000000000000000000001001 (base 2) 
    14 (base 10) = 00000000000000000000000000001110 (base 2) 
        -------------------------------- 
14 & 9 (base 10) = 00000000000000000000000000001000 (base 2) = 8 (base 10) 

Spostamento a sinistra (9 < < 2 spostamenti di bit di 9 in binario, 2 bit a sinistra):

 9 (base 10): 00000000000000000000000000001001 (base 2) 
        -------------------------------- 
9 << 2 (base 10): 00000000000000000000000000100100 (base 2) = 36 (base 10) 
3

Gli operatori >> e << sono uno spostamento bit a bit. Ad esempio,

11 =  00001011 
11 << 3 = 01011000 = 88 

Vale la pena notare che m << n = m * 2^n e m >> n = m/2^n. Questo a volte viene utilizzato per effettuare moltiplicazioni/divisioni molto efficienti con le potenze di 2.

I numeri & e | sono bit a bit e eo rispettivamente.

11 =  00001011 
28 =  00011100 
11 & 28 = 00001000 = 8 

11 =  00001011 
28 =  00011100 
11 | 28 = 00011111 = 31 

mentre io sono a esso, vorrei ricordare l'operatore ^, che non viene utilizzato per il potere, ma per bit esclusivo-o.

11 =  00001011 
28 =  00011100 
11^28 = 00010111 = 23