O que >> e << significam em Python?

94

Percebo que posso fazer coisas como 2 << 5obter 64 e 1000 >> 2250.

Também posso usar >>em print:

print >>obj, "Hello world"

O que esta acontecendo aqui?

user3201152
fonte
3
Aqui, agora você pode inserir esses símbolos em um mecanismo de pesquisa e fazer com que ele realmente os procure: symbolhound.com
user2357112 suporta Monica
possível duplicata de operação e uso bit a bit
vaultah
3
@ user2357112 Isso será muito útil, obrigado. E para aqueles que dizem que é uma questão básica, pode ser, mas eu não tinha o conceito de operadores bit a bit, então nunca teria pensado em procurar isso na documentação ...
user3201152
@joaquin agora é o resultado número um no google para python maior que maior que.
Jordan Reiter

Respostas:

64

Acho que é uma questão importante e ainda não foi respondida (o OP parece já saber sobre os operadores de turno). Deixe-me tentar responder, o operador >> em seu exemplo é usado para dois propósitos diferentes. Em termos de c ++, esse operador está sobrecarregado. No primeiro exemplo, ele é usado como operador bit a bit (deslocamento para a esquerda), enquanto no segundo cenário é usado apenas como redirecionamento de saída. ie

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, 

exemplo

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

atualizar:

Em Python 3, é possível fornecer o argumento do arquivo diretamente da seguinte maneira:

print("Hello world", file=open("foo.txt", "a")) # hello world now saved in foo.txt
yosemite_k
fonte
13
Para sua informação, outro uso comum do operador de deslocamento direito que você pode ver no código Python ocorrerá nos arquivos do Airflow. A estrutura do Airflow sobrecarrega o operador '>>' para indicar que uma tarefa é ascendente da outra: stackoverflow.com/questions/52389105/…
schimmy
3
você pode realmente substituir esses operadores por meio dos métodos __rshift__e __lshift__.
trudolf
Estou obtendo que 2 >> 5 é igual a 0. Achei que deveria ser igual a 0,0001?
lightbox142
1
@ teter123f a operação é binária. não é uma operação decimal.
yosemite_k
62

Esses são operadores de mudança bit a bit.

Citando os documentos :

x << y

Retorna xcom os bits deslocados para a esquerda em y lugares (e os novos bits no lado direito são zeros). Isso é o mesmo que multiplicar xpor 2**y.

x >> y

Retorna xcom os bits deslocados para a direita por y lugares. Isso é o mesmo que dividir xpor 2**y.

James
fonte
2
Talvez um exemplo ajudaria, digite uma série de estes em Python: print bin(1), print bin(1 << 1), print bin(17), print bin(17 >> 1)e assim por diante. Você pode ver como funciona sem explicações.
bartekbrak
4
O operador de deslocamento de bit requer 2 operandos, então por que o operando é "imprimir" e o operando 2 um objeto? como emprint >>obj, "Hello world"
Qi Fan
É uma resposta ao contexto fornecido pelo OP (e, portanto, conhecido do OP) e não à pergunta feita.
z33k de
1
@Qi Fan @ z33k A pergunta foi editada para adicionar a referência para impressão mais de um ano após esta resposta ter sido escrita. A pergunta original mencionada apenas 2 << 5e 1000 >> 2 ¯_ (ツ) _ / ¯
Tiago de
26

12 << 2

48

O valor binário real de 12 é "00 1100" quando executamos a instrução acima. O deslocamento à esquerda (2 casas deslocadas para a esquerda) retorna o valor 48 e seu valor binário é "11 0000".

48 >> 2

12

O valor binário de 48 é "11 0000", após a execução da instrução acima, o deslocamento para a direita (2 casas deslocadas para a direita) retorna o valor 12 e seu valor binário é "00 1100".

PAC
fonte
13

Eles são o operador de mudança de bit que existe em muitas linguagens de programação convencionais, <<é o deslocamento para a esquerda e >>é o deslocamento para a direita, eles podem ser demonstrados na tabela a seguir, suponha que um inteiro leve apenas 1 byte na memória.

| 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
fonte
Procurando exatamente por esta explicação.
shaik moeed
12

O outro caso envolvendo print >>obj, "Hello World"é a sintaxe "print chevron" para a print instrução em Python 2 (removida em Python 3, substituída pelo fileargumento da print() função ). Em vez de gravar na saída padrão, a saída é passada para o obj.write()método. Um exemplo típico seria objetos de arquivo com um write()método. Veja a resposta a uma pergunta mais recente: Sinal de maior que duplo em Python .

chrstphrchvz
fonte
7

Estes são os operadores de turno

x << y Retorna x com os bits deslocados para a esquerda por y lugares (e os novos bits no lado direito são zeros). Isso é o mesmo que multiplicar x por 2 ** y.

x >> y Retorna x com os bits deslocados para a direita por y casas. Isso é o mesmo que // 'obter x por 2 ** y.

doctorlove
fonte
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
fonte
-1

Eu verifiquei o seguinte no Python 2.7 e no Python 3.8

Eu imprimi (100 << 3) A conversão de 100 em binário resulta em 1100100. O que fiz foi eliminar os primeiros 3 bits e adicionar 3 bits com o valor '0' no final. Portanto, o resultado deve ser 0100000, converti isso para decimal e a resposta foi 32.

Para minha surpresa, quando executei print (100 << 3), a resposta foi 800. Fiquei intrigado. Converti 800 para binário para verificar o que está acontecendo. E é isso que eu tenho 1100100000.

Se você vir como 800 era a resposta do Python, eles não mudaram ou eliminaram os primeiros 3 bits, mas adicionaram o valor '0' aos últimos 3 bits.

Onde como print (100 >> 3), funcionou perfeito. Fiz cálculos manuais e verifiquei o resultado da impressão do python. Funcionou corretamente. Últimos 3 bits removidos e valor adicionado '0' aos primeiros 3 bits.

Parece com (100 << 3), o operador de deslocamento para a esquerda tem um bug no Python.

Nandish
fonte
Sem bug, não está limitado a 8 bits por número.
Oso
Ambos os operadores << e >> devem trabalhar com a mesma lógica. Mas o operador << está se comportando de maneira diferente. Eu registrei um bug comportamental com Python apenas jow.
Nandish