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.
Definition vom right-shift-operator
@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.
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.
- Goswin
- User
- Beiträge: 363
- Registriert: Freitag 8. Dezember 2006, 11:47
- Wohnort: Ulm-Böfingen
- Kontaktdaten:
In der Tat, dort steht es:
Die Darstellung ist offiziell 2-complement, also sollte (in Pseudocode) folgendes gelten:
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 für beliebige n,k gilt (hoffentlich habe ich das so richtig hergeleitet).
Mein Dank an Blackjack!
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)
Mein Dank an Blackjack!