Was bedeuten >> und << in Python?

90

Ich merke, dass ich Dinge tun kann 2 << 5, um 64 und 1000 >> 2250 zu bekommen.

Auch kann ich verwenden >>in print:

print >>obj, "Hello world"

Was passiert hier?

user3201152
quelle
3
Hier, jetzt können Sie diese Symbole in eine Suchmaschine einbinden
user2357112 unterstützt Monica am
Mögliches Duplikat von Bitwise Operation and Usage
Vaultah
3
@ user2357112 Das wird sehr hilfreich sein, danke. Und für diejenigen, die sagen, dass es eine grundlegende Frage ist, mag es sein, aber ich hatte kein Konzept für bitweise Operatoren, also hätte ich nie gedacht, das in der Dokumentation
nachzuschlagen
@joaquin es ist jetzt das Ergebnis Nummer eins in Google für Python größer als größer als.
Jordan Reiter

Antworten:

63

Ich denke, es ist eine wichtige Frage, die noch nicht beantwortet wurde (das OP scheint bereits über Schichtbetreiber Bescheid zu wissen). Lassen Sie mich versuchen zu antworten, der Operator >> in Ihrem Beispiel wird für zwei verschiedene Zwecke verwendet. In C ++ ist dieser Operator überladen. Im ersten Beispiel wird es als bitweiser Operator (Linksverschiebung) verwendet, während es im zweiten Szenario lediglich als Ausgabeumleitung verwendet wird. dh

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, 

Beispiel

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

aktualisieren:

In Python 3 ist es möglich, das Dateiargument direkt wie folgt anzugeben:

print("Hello world", file=open("foo.txt", "a")) # hello world now saved in foo.txt
yosemite_k
quelle
11
Zu Ihrer Information, dass eine andere häufige Verwendung des rechten Schichtoperators, die Sie möglicherweise im Python-Code sehen, in Airflow-Dateien vorkommt. Das Airflow-Framework überlastet den Operator '>>', um anzuzeigen, dass eine Aufgabe der anderen vorgelagert ist: stackoverflow.com/questions/52389105/…
schimmy
3
Sie können diese Operatoren über die Methoden __rshift__und tatsächlich überschreiben __lshift__.
Trudolf
Ich bekomme, dass 2 >> 5 gleich 0 ist. Ich dachte, es sollte gleich 0,0001 sein?
lightbox142
1
@ teter123f die Operation ist binär. Es ist keine Dezimaloperation.
yosemite_k
61

Dies sind bitweise Verschiebungsoperatoren.

Zitat aus den Dokumenten :

x << y

Gibt zurück, xwobei die Bits um y Stellen nach links verschoben sind (und neue Bits auf der rechten Seite sind Nullen). Dies entspricht dem Multiplizieren xmit 2**y.

x >> y

Gibt zurück, xwobei die Bits um y Stellen nach rechts verschoben sind. Dies ist die gleiche wie Dividieren xdurch 2**y.

James
quelle
2
Vielleicht wäre ein Beispiel helfen, eine Reihe von ihnen in Python Typ: print bin(1), print bin(1 << 1), print bin(17), print bin(17 >> 1)und so weiter. Sie können sehen, wie es ohne Erklärungen funktioniert.
Bartekbrak
4
Der Bitverschiebungsoperator erfordert 2 Operanden. Warum ist der Operand "print" und der Operand 2 ein Objekt? wie inprint >>obj, "Hello world"
Qi Fan
Es ist eine Antwort auf den Kontext, den das OP bereitgestellt hat (und dem OP somit bekannt ist) und nicht auf die gestellte Frage.
z33k
@Qi Fan @ z33k Die Frage wurde bearbeitet, um die Referenz zum Drucken mehr als ein Jahr nach dem Schreiben dieser Antwort hinzuzufügen. Die ursprüngliche Frage nur erwähnt 2 << 5und 1000 >> 2 ¯_ (ツ) _ / ¯
James
24

12 << 2

48

Der tatsächliche Binärwert von 12 ist "00 1100", wenn wir die obige Anweisung ausführen. Die Linksverschiebung (2 Stellen nach links verschoben) gibt den Wert 48 zurück. Der Binärwert ist "11 0000".

48 >> 2

12

Der Binärwert von 48 ist "11 0000", nachdem die obige Anweisung ausgeführt wurde. Die Rechtsverschiebung (2 Stellen nach rechts verschoben) gibt den Wert 12 zurück. Der Binärwert ist "00 1100".

PAC
quelle
12

Der andere Fall print >>obj, "Hello World"ist die "print chevron" -Syntax für die print Anweisung in Python 2 (in Python 3 entfernt, ersetzt durch das fileArgument der print() Funktion ). Anstatt in die Standardausgabe zu schreiben, wird die Ausgabe an die obj.write()Methode übergeben. Ein typisches Beispiel wären Dateiobjekte mit einer write()Methode. Siehe die Antwort auf eine neuere Frage: Doppelt größer als in Python anmelden .

chrstphrchvz
quelle
11

Sie sind Bitverschiebungsoperatoren, die in vielen gängigen Programmiersprachen existieren, <<die Linksverschiebung und >>die Rechtsverschiebung sind. Sie können wie in der folgenden Tabelle gezeigt werden. Nehmen Sie an, dass eine Ganzzahl nur 1 Byte im Speicher benötigt.

| 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
quelle
Genau nach dieser Erklärung suchen.
Shaik Moeed
7

Dies sind die Schichtoperatoren

x << y Gibt x zurück, wobei die Bits um y Stellen nach links verschoben sind (und neue Bits auf der rechten Seite sind Nullen). Dies entspricht dem Multiplizieren von x mit 2 ** y.

x >> y Gibt x zurück, wobei die Bits um y Stellen nach rechts verschoben sind. Dies ist dasselbe wie // x x 2 ** y.

Doktorliebe
quelle
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
quelle