Co oznaczają >> i << w Pythonie?

90

Zauważam, że mogę na przykład 2 << 5zdobyć 64 i 1000 >> 2250.

Mogę również używać >>w print:

print >>obj, "Hello world"

Co tu się dzieje?

user3201152
źródło
3
Tutaj, teraz możesz podłączyć te symbole do wyszukiwarki i poprosić o ich wyszukanie
użytkownik2357112 obsługuje Monikę
możliwy duplikat operacji i użycia
bitowego
3
@ user2357112 To będzie bardzo pomocne, dzięki. A dla tych, którzy mówią, że jest to podstawowe pytanie, być może, ale nie miałem pojęcia o operatorach bitowych, więc nigdy bym nie pomyślał, aby sprawdzić to w dokumentacji ...
user3201152
@joaquin to teraz numer jeden w wynikach Google dla Pythona większy niż większy niż.
Jordan Reiter,

Odpowiedzi:

63

Myślę, że to ważne pytanie, na które jeszcze nie ma odpowiedzi (wydaje się, że PO już wie o operatorach zmianowych). Spróbuję odpowiedzieć, operator >> w twoim przykładzie jest używany do dwóch różnych celów. W terminach C ++ ten operator jest przeciążony. W pierwszym przykładzie jest używany jako operator bitowy (przesunięcie w lewo), podczas gdy w drugim scenariuszu jest używany tylko jako przekierowanie wyjścia. to znaczy

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, 

przykład

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

aktualizacja:

W Pythonie 3 można bezpośrednio podać argument pliku w następujący sposób:

print("Hello world", file=open("foo.txt", "a")) # hello world now saved in foo.txt
yosemite_k
źródło
11
FYI, że inne powszechne użycie prawego operatora zmiany, które możesz zobaczyć w kodzie Pythona, pojawi się w plikach Airflow. Struktura Airflow przeciąża operatora „>>”, aby wskazać, że jedno zadanie znajduje się nad drugim: stackoverflow.com/questions/52389105/ ...
schimmy
3
faktycznie możesz zastąpić te operatory za pomocą metod __rshift__i __lshift__.
trudolf
Otrzymuję, że 2 >> 5 jest równe 0. Myślałem, że powinno równać się 0,0001?
lightbox142
1
@ teter123f operacja jest binarna. nie jest to operacja dziesiętna.
yosemite_k
61

Są to operatory przesunięcia bitowego.

Cytując z dokumentów :

x << y

Zwraca xz bitami przesuniętymi w lewo o y miejsca (a nowe bity po prawej stronie są zerami). To to samo, co pomnożenie xprzez 2**y.

x >> y

Wraca xz bitami przesuniętymi w prawo o y miejsc. To to samo, co dzielenie xprzez 2**y.

James
źródło
2
Może przykład pomoże, należy wpisać serię nich w Pythonie: print bin(1), print bin(1 << 1), print bin(17), print bin(17 >> 1)i tak dalej. Możesz zobaczyć, jak to działa bez wyjaśnień.
bartekbrak
4
Operator przesunięcia bitowego wymaga 2 operandów, więc dlaczego operand to „print”, a operand 2 to obiekt? jak wprint >>obj, "Hello world"
Qi Fan
Jest to odpowiedź na kontekst przedstawiony w PO (a tym samym znany PO), a nie na zadane pytanie.
z33k
@Qi Fan @ z33k Pytanie zostało zredagowane w celu dodania odniesienia do druku ponad rok po napisaniu tej odpowiedzi. Oryginalne pytanie dotyczyło tylko 2 << 5i 1000 >> 2 ¯_ (ツ) _ / ¯
James
24

12 << 2

48

Rzeczywista wartość binarna 12 to „00 1100”, gdy wykonujemy powyższą instrukcję. Przesunięcie w lewo (przesunięcie o 2 miejsca w lewo) zwraca wartość 48, a wartość binarna to „11 0000”.

48 >> 2

12

Wartość binarna 48 to „11 0000”, po wykonaniu powyższej instrukcji Przesunięcie w prawo (o 2 miejsca przesunięte w prawo) zwraca wartość 12, jej wartość binarna to „00 1100”.

PAC
źródło
12

Innym przypadkiem print >>obj, "Hello World"jest składnia „print chevron” dla print instrukcji w Pythonie 2 (usunięta w Pythonie 3, zastąpiona fileargumentem print() funkcji ). Zamiast zapisywać na standardowe wyjście, dane wyjściowe są przekazywane do obj.write()metody. Typowym przykładem mogą być obiekty plików posiadające write()metodę. Zobacz odpowiedź na nowsze pytanie: Podwójny znak większy niż w Pythonie .

chrstphrchvz
źródło
11

Są operatorem przesunięcia bitowego, który istnieje w wielu głównych językach programowania, <<jest przesunięciem w lewo i >>jest przesunięciem w prawo, można je zademonstrować w poniższej tabeli, zakładając, że liczba całkowita zajmuje tylko 1 bajt w pamięci.

| 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
źródło
Dokładnie szukam tego wyjaśnienia.
shaik moeed
7

To są operatorzy zmian

x << y Zwraca x z bitami przesuniętymi w lewo o y miejsca (a nowe bity po prawej stronie są zerami). To to samo, co pomnożenie x przez 2 ** y.

x >> y Zwraca x z bitami przesuniętymi w prawo o y miejsc. To jest to samo, co // 'ing x by 2 ** y'.

doctorlove
źródło
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
źródło