PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schieben & Rollen verstehen



Cysign
08.10.2014, 02:10
Hallo zusammen,

immer mal wieder stolpere ich über >> oder << in C, aber wirklich verstanden habe ich Schieben und Rollen noch nicht.
Hat da jemand vielleicht ne idiotensicherer Erklärung parrat? ;)

Peter(TOO)
08.10.2014, 03:01
Hallo,

C kann nur logisch Verschieben.
http://de.wikipedia.org/wiki/Bitweiser_Operator#Logische_Verschiebung
http://de.wikipedia.org/wiki/Bitweiser_Operator#C_und_C.2B.2B

MfG Peter(TOO)

oberallgeier
08.10.2014, 09:31
... stolpere ich über >> oder << in C, aber wirklich verstanden habe ich Schieben und Rollen noch nicht ...Wo kommt denn das "Rollen" vor? Hast Du da einen Hinweis für uns, einen Link oder so ?

Die Links von Peter(TOO) zum Wikipedia geben ja ne gute Vorstellung zum Schieben, und die Operatoren heißen ja auch shift-Operatoren. Rollen KÖNNTE aus der Assemblerecke kommen bei der es (z.B. bei den Atmels) ein rotate gibt.

Unterschiede treten auf: shift ist nur innerhalb der Bitbreite des (linken) Operanden definiert - in meinem KernighanRitchie steht noch die anschauliche Erläuterung:
Der Wert von E1<<E2 ist E1 (interpretiert als Bit-Muster) um E2 Bits nach links verschoben. Wenn kein Overflow eintritt, ist das äquivalent zu einer Multiplikation mit mit 2E2. Der Wert von E1>>E2 ist E1 um E2 Bit-Positionen nach rechts verschoben. ... Es gibt implementierungsabhängige Sonderfälle.

Beim rotate gehts ja üblicherweise durchs Carry hindurch, da taucht z.B. der Overflow "hinten" wieder im Ergebnis auf, hier mal zwei Zitate aus der Assemblerhilfe zum Atmel-Befehlssatz:

ROL - Rotate Left trough Carry

Description:
Shifts all bits in Rd one place to the left. The C flag is shifted into bit 0 of Rd. Bit 7 is shifted into the C flag. This operation, combined with LSL, effectively multiplies multi-byte signed and unsigned values by two.

Operation:

C ¨ b7 ------------------b0 ← C

Syntax: Operands: Program Counter:

(i)ROL Rd 0 ≤ d ≤ 31 PC ← PC + 1

================================= >< ===================================

LSL - Logical Shift Left

Description:
Shifts all bits in Rd one place to the left. Bit 0 is cleared. Bit 7 is loaded into the C flag of the SREG. This operation effectively multiplies signed and unsigned values by two.

Operation:

C ¨ b7 ------------------b0 ← 0

Das Carry nimmt also in beiden Fällen den Overflow auf, aber der wird nur beim Rotate weiter verarbeitet. Das Rotate und das Shift gehen rechts sinngemäß.

PICture
08.10.2014, 10:08
Hallo!


Beim rotate gehts ja üblicherweise durchs Carry hindurch, da taucht z.B. der Overflow "hinten" wieder im Ergebnis auf ...

Ich habe k.A. über "Cäh" und kenne nur ASM (Assembler). Art von "rotate" hängt vom ASM Befehlsatz der CPU. Viele CPUs können "rotate" ohne Carry z.B. PIC18FXXXX. Dann gibt es keine Änderung vom "overflow". Sie kennen eben "rotate left/right through bzw. no carry"

Peter(TOO)
08.10.2014, 10:52
Hols der Geier ;-)

Wo kommt denn das "Rollen" vor? Hast Du da einen Hinweis für uns, einen Link oder so ?

Die Links von Peter(TOO) zum Wikipedia geben ja ne gute Vorstellung zum Schieben, und die Operatoren heißen ja auch shift-Operatoren. Rollen KÖNNTE aus der Assemblerecke kommen bei der es (z.B. bei den Atmels) ein rotate gibt.
Rollen = Rotate
Ist auch in meinem Link beschrieben.

Rollen können eigentlich alle CPUs. Den Befehl benötigt man, wenn man mehr Bits schieben will, als in ein Register passen.

Man fängt mit einer Schiebung an, das Bit welches rausfällt wird dann im Carry abgelegt.
Beim nächsten Wert wird dann rotiert. Dabei wird das Carry eingeschoben und das rausfallende Bit landet wiederum im Carry.
So kann man beliebig lange Bitfolgen schieben.

Schieben gibt's dann noch als logisch und Arithmetisch.
Wobei eigentlich nur die Schiebung nach rechts unterschiedlich ist. Beim arithmetischen rechts Schieben wird das MSB verdoppelt, weil es als Vorzeichen behandelt wird.

Die Schiebe- und Rollbefehle sind die Grundlage für Multiplikation und Division.
Der 6502 hatte noch keine Befehle für Multiplikation und Division, dazu brauchte man Assembler Unterprogramme.

Auf C-Ebene werden die Schiebeoperationen hauptsächlich für "Bit-Fummeleien" verwendet.

MfG Peter(TOO)

Searcher
08.10.2014, 11:33
Das Carry oder Übertragsbit oder Carryflag oder Carrybit ist bei den AVR ein Bit im SREG (Statusregister) \\:D/:wink:

Cysign
10.10.2014, 23:07
Ich muss mri das einfach noch 2-3 Mal in Ruhe durchlesen. Konkret im Zusammenhang mit C hab ich Rotieren meine ich noch nicht gelesen. Aber mir geht es ja darum beides prinzipiell zu verstehen ;)

@Peter: Genau für so "Bit-Fummeleien" in C interessierts mich ja ;)
Hatte da z.B. mal ein Beispielscript zu nem i2c-Temperatursensor, wo das Verständnis daran gescheitert ist. Damit will ich mich demnächst nochmal befassen, das verlangt mein Ego :D