Unterschied: logsicher und arithmetischer shift bzw. schieben
Moin,
kann mir jemand am besten an Hand eines Beispiels sagen, wo genau der Unterschied zwischen einem logsichen und einem arithmetischen schift liegt?
Wenn ich z.B. die 16 um 31 stellen nach links shiften will, wo liegt dann der Unterschied zwischen einem logsichen und arithmetischen schift?
Das selbe Beispiel gilt dann auch für ein rechten Shift, sprich die 16 um 31 stellen nach rechts Shiften.
Ich danke euch im Vorraus :)
2 Antworten
Was man unter einem "arithmetischen Shift nach links" versteht, hängt vom Prozessor ab. Mir persönlich sind zwei unterschiedliche Varianten bekannt. Die meisten Prozessoren haben aber gar keinen "arithmetischen Shift nach links".
Beim Shift nach rechts gilt folgendes:
Ein Shift nach rechts entspricht einer Division durch 2. Bei vorzeichenlosen oder positiven Zahlen muss man dazu die fehlenden Stellen auf der rechten Seite mit Nullen auffüllen; bei negativen Zahlen im Zweierkomplement mit Einsen.
Wenn nun die vordere Stelle einer Zahl eine Eins ist, so muss man wissen, ob es sich um eine vorzeichenlose oder eine negative Zahl handelt:
10101010 shr 4 = 11111010 (negativ)
10101010 shr 4 = 00001010 (vorzeichenlos)
01010101 shr 4 = 00000101 (immer; vordere Stelle ist eine 0)
- Der "logische Shift" geht dabei von einer vorzeichenlosen Zahl aus.
- Der "arithmetische Shift" geht von einer vorzeichenbehafteten Zahl aus - es wird also mit der Ziffer (0 oder 1) aufgefüllt, die zuvor an der Stelle ganz links war.
Bei manchen Prozessoren werden auch die Statusbits bei arithmetischem und logischem Shift unterschiedlich gesetzt.
Das kann man beides in der Wikipedia nachlesen: http://de.wikipedia.org/wiki/Logische_Verschiebung
Im Artikel kannst du dann auch den Link zur arithmetischen Verschiebung anklicken …
Außerdem gibt es dann noch das „Rotieren“ der Operatoren nach links bzw. rechts mit und ohne Carry-Flag. Hoffentlich kommst du jetzt nicht ins „Rotieren“ …