Seite 1 von 1

Right Shift in Python

Verfasst: Dienstag 22. Mai 2012, 10:23
von bRainLaG
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

Re: Right Shift in Python

Verfasst: Dienstag 22. Mai 2012, 10:32
von EyDu
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

Re: Right Shift in Python

Verfasst: Dienstag 22. Mai 2012, 10:40
von bRainLaG
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.

Re: Right Shift in Python

Verfasst: Dienstag 22. Mai 2012, 10:50
von EyDu
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.

Re: Right Shift in Python

Verfasst: Dienstag 22. Mai 2012, 11:02
von bRainLaG
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

Re: Right Shift in Python

Verfasst: Dienstag 22. Mai 2012, 11:14
von bRainLaG
Abschließend nur eins das ich festgestellt habe:

Right Shift entspricht der Division durch pow(2,n) nicht durch 2 :)
ansonsten alles super

Re: Right Shift in Python

Verfasst: Dienstag 22. Mai 2012, 11:21
von Hyperion
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...

Re: Right Shift in Python

Verfasst: Dienstag 22. Mai 2012, 11:42
von bRainLaG
Naja dachte man könnte es falsch verstehen :(

Re: Right Shift in Python

Verfasst: Dienstag 22. Mai 2012, 11:48
von jerch
@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 :)