Definition vom right-shift-operator

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
Benutzeravatar
Goswin
User
Beiträge: 363
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen
Kontaktdaten:

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.
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.
Benutzeravatar
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:

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!
Antworten