Cosa significano >> e << in Python?


94

Noto che posso fare cose come 2 << 5ottenere 64 e 1000 >> 2250.

Inoltre posso usare >>in print:

print >>obj, "Hello world"

Cosa sta succedendo qui?



3
Qui, ora puoi inserire quei simboli in un motore di ricerca e farli effettivamente cercare: symbolhound.com
user2357112 supporta Monica

possibile duplicato di Bitwise Operation and Usage
vaultah

3
@ user2357112 Sarà davvero utile, grazie. E a coloro che dicono che è una domanda di base, può essere, ma non avevo il concetto di operatori bit per bit, quindi non avrei mai pensato di cercarlo nella documentazione ...
user3201152

@joaquin è ora il risultato numero uno in google per python maggiore di maggiore di.
Jordan Reiter

Risposte:


64

Penso che sia una domanda importante e non ha ancora una risposta (l'OP sembra già conoscere gli operatori di turno). Vorrei provare a rispondere, l'operatore >> nel tuo esempio viene utilizzato per due scopi diversi. In termini c ++ questo operatore è sovraccarico. Nel primo esempio viene utilizzato come operatore bit per bit (shift a sinistra), mentre nel secondo scenario viene utilizzato semplicemente come reindirizzamento dell'output. cioè

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, 

esempio

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

aggiornare:

In python 3 è possibile dare l'argomento file direttamente come segue:

print("Hello world", file=open("foo.txt", "a")) # hello world now saved in foo.txt

13
Cordiali saluti, un altro uso comune dell'operatore di spostamento destro che potresti vedere nel codice Python si verificherà nei file Airflow. Il quadro del flusso d'aria sovraccarica l'operatore '>>' per indicare un compito è a monte l'altro: stackoverflow.com/questions/52389105/...
schimmy

3
puoi effettivamente sovrascrivere questi operatori tramite i metodi __rshift__e __lshift__.
trudolf

Sto ottenendo che 2 >> 5 è uguale a 0. Ho pensato che dovrebbe essere uguale a 0.0001?
lightbox142

1
@ teter123f l'operazione è binaria. non è un'operazione decimale.
yosemite_k

62

Questi sono operatori di spostamento bit a bit.

Citando dai documenti :

x << y

Restituisce xcon i bit spostati a sinistra di y posizioni (e i nuovi bit sul lato destro sono zeri). Questo equivale a moltiplicare xper 2**y.

x >> y

Ritorna xcon i bit spostati a destra di y posizioni. Equivale a dividere xper 2**y.


2
Forse un esempio potrebbe aiutare, digitare una serie di questi in Python: print bin(1), print bin(1 << 1), print bin(17), print bin(17 >> 1)e così via. Puoi vedere come funziona senza spiegazioni.
bartekbrak

4
L'operatore di spostamento di bit richiede 2 operandi, quindi perché l'operando è "print" e l'operando 2 un oggetto? come inprint >>obj, "Hello world"
Qi Fan

È una risposta al contesto fornito dal PO (e quindi noto a OP) e non alla domanda posta.
z33k

1
@Qi Fan @ z33k La domanda è stata modificata per aggiungere il riferimento da stampare più di un anno dopo che questa risposta è stata scritta. La domanda originale menzionata solo 2 << 5e 1000 >> 2 ¯_ (ツ) _ / ¯
James,

26

12 << 2

48

Il valore binario effettivo di 12 è "00 1100" quando si esegue l'istruzione precedente Spostamento a sinistra (2 posizioni spostate a sinistra) restituisce il valore 48 il suo valore binario è "11 0000".

48 >> 2

12

Il valore binario di 48 è "11 0000", dopo aver eseguito l'istruzione precedente Shift a destra (2 posizioni spostate a destra) restituisce il valore 12 il suo valore binario è "00 1100".


13

Sono operatori di spostamento di bit che esistono in molti linguaggi di programmazione tradizionali, <<è lo spostamento a sinistra ed >>è lo spostamento a destra, possono essere dimostrati come nella tabella seguente, supponendo che un numero intero richieda solo 1 byte in 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 |

Cercando esattamente questa spiegazione.
Shaik Moeed

12

L'altro caso che coinvolge print >>obj, "Hello World"è la sintassi "print chevron" per l' print istruzione in Python 2 (rimossa in Python 3, sostituita filedall'argomento della print() funzione ). Invece di scrivere sullo standard output, l'output viene passato al obj.write()metodo. Un tipico esempio potrebbero essere gli oggetti file con un write()metodo. Vedi la risposta a una domanda più recente: doppio segno maggiore di in Python .


7

Questi sono gli operatori di turno

x << y Restituisce x con i bit spostati a sinistra di y posizioni (e i nuovi bit sul lato destro sono zeri). Questo equivale a moltiplicare x per 2 ** y.

x >> y Restituisce x con i bit spostati a destra di y posizioni. È lo stesso di // 'ing x by 2 ** y.


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

-1

Ho verificato quanto segue sia su Python 2.7 che su Python 3.8

Ho stampato (100 << 3) La conversione di 100 in binario dà 1100100. Quello che ho fatto è stato eliminare i primi 3 bit e aggiunto 3 bit con il valore "0" alla fine. Quindi dovrebbe risultare come 0100000 e l'ho convertito in Decimale e la risposta era 32.

Per la mia sorpresa quando ho eseguito print (100 << 3) la risposta era 800. Ero perplesso. Ho convertito 800 in binario per controllare cosa sta succedendo. E questo è quello che ho ottenuto 1100100000.

Se vedi come 800 era la risposta di Python, non hanno spostato o rilasciato i primi 3 bit ma hanno aggiunto il valore "0" agli ultimi 3 bit.

Dove come stampa (100 >> 3), ha funzionato perfettamente. Ho eseguito calcoli manuali e verificato il risultato della stampa da Python. Ha funzionato correttamente. Eliminati gli ultimi 3 bit e il valore aggiunto "0" ai primi 3 bit.

Sembra che (100 << 3), l'operatore di spostamento a sinistra abbia un bug su Python.


Nessun bug, semplicemente non è limitato a 8 bit per numero.
Oso

Entrambi gli operatori << e >> dovrebbero funzionare con la stessa logica. Ma l'operatore << si comporta in modo diverso. Ho segnalato un bug comportamentale con Python appena jow.
Nandish
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.