Seite 1 von 1

Definition vom right-shift-operator

Verfasst: Montag 16. Januar 2012, 09:15
von Goswin
Ich kann die genaue Definition vom right-shift-operator ((-20)>>2 usw) weder im Summerfield noch im Internet finden, obwohl ich nicht in Frage stelle, dass sie irgendwo vorhanden ist (die vom left-shift kenne ich genausowenig, ist aber anscheinend leichter zu erraten) . Die Definition von ">>" scheint mir von der internen Darstellung ganzer Zahlen abhängig zu sein, welche mir unbekannt ist. Ist diese interne Darstellung überhaupt genormt und festgelegt? Wenn die Bits nach rechts verschoben werden, werden *alle* Bits verschoben oder alle außer dem ersten von links aus? Auf welchen Wert wird die links freiwerdende Bitstelle gesetzt?

Es geht mir haupsächlich um das Shiften von negativen ganzen Zahlen (bei positiven Zahlen kann ich mir die Vorgehensweise in etwa vorstellen). Ich benutze Python_3.2 mit numpy_1.6, und hoffe einmal, dass sich der shift-Operator in numpy und plain-Python gleich verhält.

Re: Definition vom right-shift-operator

Verfasst: Montag 16. Januar 2012, 09:29
von BlackJack
@goswin: Versuch es doch mal mit der Python-Dokumentation: http://docs.python.org/library/stdtypes.html#index-630

Da steht sowohl auf welche Darstellung (Zweierkomplement) sich die Operation bei ganzen Zahlen beziehen, als auch was eine äquivalente Berechnung wäre, wenn es die Shift-Operatoren nicht gäbe (Multiplikation/Division mit ``pow(2, n)``).

Die Hoffnung das sich die Shift-Operatoren bei `numpy` ähnlich verhalten, würde ich teilen, man sollte aber immer daran denken, dass die Operatoren bei jedem Typ anders implementiert sein können. Die Objekte entscheiden ja selbst wie sie sich verhalten.

Re: Definition vom right-shift-operator

Verfasst: Montag 16. Januar 2012, 14:59
von Goswin
In der Tat, dort steht es:
Die Darstellung ist offiziell 2-complement, also sollte (in Pseudocode) folgendes gelten:

Code: Alles auswählen

bitrepr(-1) == 1111...1111
bitrepr(-2) == 1111...1110
bitrepr(-3) == 1111...1101
bitrepr(-4) == 1111...1100

Bei Rechtsshift werden alle Bits außer dem linksaußenen nach rechts verschoben und der linksaußene wird so oft wie nötig wiederholt; nur so würde gewährleistet, dass

Code: Alles auswählen

(n>>k) == floor(n/2**k)
für beliebige n,k gilt (hoffentlich habe ich das so richtig hergeleitet).

Mein Dank an Blackjack!