Right Shift in Python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
bRainLaG
User
Beiträge: 5
Registriert: Freitag 23. April 2010, 09:41

Hallo liebe Community ich wende mich an euch weil ich ein Problem habe:

Code: Alles auswählen

for i in range (0, wsize):
 bits = str((num >> i) % 2) + bits
Bei diesem Code wurde Right Shift verwendet, und obwohl ich nun die Python Doku durchgelesen habe, und auch andere Comments wird mir nicht genau klar was hier passiert.
Das Programm soll aus der Dezimalzahl num eine Zweierkomplementdarstellung machen.
Ich kann mir allerdings nun nicht erklären was genau bei Right Shift passiert, da ich dies aber gerne wissen würde habe ich gehofft mir könnte das vielleicht jemand erklären.

Als weitere Erklärung wsize ist lediglich die Window Size welche am Anfang der Funktion mit übergeben wird in dessen Rahmen sich die Darstellung bewegen sollte.

Ich hoffe ihr könnt mir helfen

Cheers
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beim Verschieben nach rechts werden einfach alle Bits um eine Position nach recht verschoben. Die Stelle ganz rechts entfällt, links wird mit einer 0 aufgefüllt. Das ganze entspricht einer Ganzzahligen Division mit 2.

Code: Alles auswählen

>>> bin(42)
'0b101010'
>>> bin(42 >> 1)
'0b10101'
>>> 42 >> 1
21
>>> bin(23)
'0b10111'
>>> bin(23 >> 1)
'0b1011'
>>> 23 >> 1
11
Das Leben ist wie ein Tennisball.
bRainLaG
User
Beiträge: 5
Registriert: Freitag 23. April 2010, 09:41

Ok das ist mir soweit klar aber mir wird noch nicht ganz klar wieso ich dabei in dem bits-String dann die binäre Darstellung erhalte, dass ist gerade mein Hauptproblem da ich einfach nicht sehe wie genau auf 0 oder 1 geprüft wird. Ich nahm erst an das Modulo dies bewirkt, allerdings kann dies ja nicht hinkommen zumindest nach meinen Überlegungen nicht.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mit dem Modulo liegst du schon richtig, daher bekommst du die 1 oder die 0. Mit dem Operator erhältst du den Rest einer Division. Der Rest einer ungeraden Zahl bei einer Division durch 2 ist immer 1, der Rest bei der Division einer geraden Zahl ist immer 0. Nun kommt noch hinzu, dass die letzte Stelle der binären Darstellung 0 ist, wenn die Zahl gerade ist und 1 wenn sie ungerade ist (da die Wertigkeit der letzten ziffer 2**0 ist). Diese beiden Aussagen musst du jetzt nur noch kombinieren.
Das Leben ist wie ein Tennisball.
bRainLaG
User
Beiträge: 5
Registriert: Freitag 23. April 2010, 09:41

Ahhh alles klar ich hab es vielen dank für die schnelle Hilfe ich war grade etwas erstaunt das es so funktioniert zumindest bei den negativen Zahlen, bei den positiven Zahlen ist die Systematik schnell durchschaut wenn man es versteht.

Nochmal Vielen Dank
bRainLaG
User
Beiträge: 5
Registriert: Freitag 23. April 2010, 09:41

Abschließend nur eins das ich festgestellt habe:

Right Shift entspricht der Division durch pow(2,n) nicht durch 2 :)
ansonsten alles super
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

bRainLaG hat geschrieben: Right Shift entspricht der Division durch pow(2,n) nicht durch 2 :)
ansonsten alles super
*Ein* RighShift entspricht genau der Division durch 2 ;-) *n* Shifts natürlich der Potenz. Kannst Du ja einfach ausrechnen:

für n=3 z.B.:
42 / ( 2^3) -> 42 / (2 * 2 * 2) -> 42 * 1/2 * 1/2 * 1/2 -> (((42 : 2) :2) :2)

Nichts anderes hatte EyDu Dir gesagt...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
bRainLaG
User
Beiträge: 5
Registriert: Freitag 23. April 2010, 09:41

Naja dachte man könnte es falsch verstehen :(
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@bRainLaG:
Wenn Du diese Erkenntnis noch verallgemeinerst auf Zahlensysteme mit von 2 (dual) oder 10 (dezimal) verschiedener Basis und die Restbetrachtung mit einbeziehst (modulo), findest Du eine allgemeine Vorschrift für die Bildung von Zahlen :)
Antworten