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?



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

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.


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”.


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 .


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 |

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'.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.