2012-05-02 15 views
11

vi esto en algún código JS:¿Qué hacen los operadores ">>" (flecha doble) y "|" (single pipe) significa en JavaScript?

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

me gusta bastante para saber lo mucho que esto significa. Específicamente ">>", una sola tubería "|" y el símbolo "&" en la última línea?

¡Muy apreciado!

+3

Operadores binarios. – Pointy

+1

(-1) Busque "operadores de JavaScript" ... -1 porque esta información está fácilmente disponible * y * ya se encuentra demasiado comúnmente en StackOverflow. –

+2

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

Respuesta

16

x >> y significa para desplazar los bits de x por y lugares a la derecha (<< a la izquierda).

x | y medio para comparar los bits de x y y, poniendo una 1 en cada bit si cualquiera x o y tiene una 1 en esa posición.

x & y es lo mismo que |, excepto que el resultado es 1 Si ambos x y y tienen una 1.

Ejemplos:

#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 

Para obtener más información, search Google for "bitwise operators".

+0

Un poco más detallado [ explicación] (http://digitalfortress.tech/js/double-arrow-js-bitwise-operator/) en caso de que aún no esté del todo convencido. –

7

>> es un desplazamiento a la derecha en modo bit. Toma los bits y los desplaza hacia la derecha n lugares . Por ejemplo, vamos a examinar 35 >> 2:

35 = 100011 shift two places 
    001000 = 8 

Y, en efecto, 35 >> 2 == 8.


| es un OR bit. Se necesitan cada bit en cada operando y ORs juntos. Puede visualizarlo como una especie de adición binaria, pero no lo lleva cuando arriba y abajo son 1. Por ejemplo, aquí está 5 | 3:

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

Y, en efecto, 5 | 3 == 7.


Por último, & es una AND bit a bit. Toma cada bit en cada operando, excepto que en lugar de dar 1 si un bit O el otro es uno, da 1 si un bit Y el otro son uno. Por ejemplo, aquí está 5 & 3:

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

Inténtelo hacia fuera; 5 & 3 == 1.


Algunos otros es posible que desee tener en cuenta son <<, que es un cambio a nivel de bits izquierda, y ^, que es un XOR (0 cuando ambos bits son los mismos, 1 si son diferentes) .

En realidad, es n módulo 32. 1 >> 32 es 1. No estoy seguro por qué.

+1

Gracias por una respuesta útil, no sarcástica. – Ashe

+0

¡Esta debería ser la respuesta exceptuada! gran explicación – DoubleA

1
  • & (AND bit a bit)
  • | (OR bit a bit)
  • < < (desplazamiento a la izquierda)
  • >> (propagación de signo desplazamiento a la derecha)

ejemplos (de https://developer.mozilla.org/en/JavaScript/Reference/Operators/Bitwise_Operators):

AND bit a bit:

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

Turno a la izquierda (9 < < 2 turnos de 9 bits en binario, 2 bits a la izquierda):

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

Los operadores >> y << son un cambio en modo bit. Por ejemplo,

11 =  00001011 
11 << 3 = 01011000 = 88 

Vale la pena señalar que m << n = m * 2^n y m >> n = m/2^n. Esto a veces se usa para hacer una multiplicación/división muy eficiente por poderes de 2.

El & y el | son a nivel de bits yy respectivamente.

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

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

Mientras estoy en ello, debería mencionar el operador ^, que no se utiliza para la energía, pero para operación O exclusiva.

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