¿Qué significa >> y << en Python?

90

Noto que puedo hacer cosas como 2 << 5obtener 64 y 1000 >> 2250.

También puedo usar >>en print:

print >>obj, "Hello world"

¿Que está sucediendo aquí?

user3201152
fuente
3
Aquí, ahora puede conectar esos símbolos en un motor de búsqueda y hacer que los busque: symbolhound.com
user2357112 apoya a Monica
posible duplicado de operación y uso
bit a bit
3
@ user2357112 Eso será realmente útil, gracias. Y para aquellos que dicen que es una pregunta básica, puede que lo sea, pero no tenía un concepto de operadores bit a bit, por lo que nunca hubiera pensado en buscar eso en la documentación ...
user3201152
@joaquin es ahora el resultado número uno en google para python mayor que mayor que.
Jordan Reiter

Respuestas:

63

Creo que es una pregunta importante y aún no está respondida (el OP parece saber ya sobre los operadores de turno). Déjame intentar responder, el operador >> en tu ejemplo se usa para dos propósitos diferentes. En términos de C ++, este operador está sobrecargado. En el primer ejemplo se usa como operador bit a bit (desplazamiento a la izquierda), mientras que en el segundo escenario se usa simplemente como redirección de salida. es decir

2 << 5 # shift to left by 5 bits
2 >> 5 # shift to right by 5 bits
print >> obj, "Hello world" # redirect the output to obj, 

ejemplo

with open('foo.txt', 'w') as obj:
    print >> obj, "Hello world" # hello world now saved in foo.txt

actualizar:

En python 3 es posible dar el argumento del archivo directamente de la siguiente manera:

print("Hello world", file=open("foo.txt", "a")) # hello world now saved in foo.txt
yosemite_k
fuente
11
Para su información, otro uso común del operador de cambio derecho que puede ver en el código Python ocurrirá en los archivos de Airflow. El marco de Airflow sobrecarga el operador '>>' para indicar que una tarea está aguas arriba de la otra: stackoverflow.com/questions/52389105/…
schimmy
3
en realidad, puede anular estos operadores a través de los métodos __rshift__y __lshift__.
trudolf
Estoy obteniendo que 2 >> 5 es igual a 0. Pensé que debería ser igual a 0.0001.
lightbox142
1
@ teter123f la operación es binaria. no es una operación decimal.
yosemite_k
61

Estos son operadores de desplazamiento bit a bit.

Citando de los documentos :

x << y

Retorna xcon los bits desplazados hacia la izquierda en y lugares (y los nuevos bits en el lado derecho son ceros). Esto es lo mismo que multiplicar xpor 2**y.

x >> y

Devuelve xcon los bits desplazados hacia la derecha en y lugares. Esto es lo mismo que dividir xpor 2**y.

James
fuente
2
Quizás un ejemplo ayudaría, escriba una serie de éstos en Python: print bin(1), print bin(1 << 1), print bin(17), print bin(17 >> 1)y así sucesivamente. Puedes ver cómo funciona sin explicaciones.
bartekbrak
4
El operador de desplazamiento de bits requiere 2 operandos, entonces, ¿por qué el operando es "imprimir" y el operando 2 es un objeto? como enprint >>obj, "Hello world"
Qi Fan
Es una respuesta al contexto proporcionado por el OP (y por lo tanto conocido por el OP) y no a la pregunta formulada.
z33k
@Qi Fan @ z33k La pregunta se editó para agregar la referencia a imprimir más de un año después de que se escribió esta respuesta. La pregunta original se menciona solo 2 << 5y 1000 >> 2 ¯_ (ツ) _ / ¯
James
24

12 << 2

48

El valor binario real de 12 es "00 1100" cuando ejecutamos la instrucción anterior. Desplazamiento a la izquierda (2 lugares desplazados a la izquierda) devuelve el valor 48, su valor binario es "11 0000".

48 >> 2

12

El valor binario de 48 es "11 0000", después de ejecutar la instrucción anterior Desplazamiento a la derecha (2 lugares desplazados a la derecha) devuelve el valor 12, su valor binario es "00 1100".

PAC
fuente
12

El otro caso que involucra print >>obj, "Hello World"es la sintaxis "print chevron" para la print declaración en Python 2 (eliminada en Python 3, reemplazada por el fileargumento de la print() función ). En lugar de escribir en la salida estándar, la salida se pasa al obj.write()método. Un ejemplo típico serían los objetos de archivo que tienen un write()método. Vea la respuesta a una pregunta más reciente: Doble signo mayor que en Python .

chrstphrchvz
fuente
11

Son un operador de desplazamiento de bits que existe en muchos lenguajes de programación convencionales, <<es el desplazamiento a la izquierda y >>es el desplazamiento a la derecha, se pueden demostrar en la siguiente tabla, suponga que un número entero solo ocupa 1 byte en la memoria.

| operate | bit value | octal value |                       description                        |
| ------- | --------- | ----------- | -------------------------------------------------------- |
|         | 00000100  |           4 |                                                          |
| 4 << 2  | 00010000  |          16 | move all bits to left 2 bits, filled with 0 at the right |
| 16 >> 2 | 00000100  |           4 | move all bits to right 2 bits, filled with 0 at the left |
Tsingyi
fuente
Buscando exactamente esta explicación.
shaik moeed
7

Estos son los operadores de turno

x << y Devuelve x con los bits desplazados hacia la izquierda en lugares y (y los nuevos bits del lado derecho son ceros). Esto es lo mismo que multiplicar x por 2 ** y.

x >> y Devuelve x con los bits desplazados a la derecha en y lugares. Esto es lo mismo que // 'ing x por 2 ** y.

doctor amor
fuente
0
<< Mean any given number will be multiply by 2the power
for exp:- 2<<2=2*2'1=4
          6<<2'4=6*2*2*2*2*2=64
Mayank Awasthi
fuente