Forum: Mikrocontroller und Digitale Elektronik Bitverschiebung *UND* Zuweisung(??)


von Tio T. (misterten)


Lesenswert?

Ich habe mal eine grundsätzliche Frage, zur Schreibweise einer 
Bitverschiebung. Wenn ich
1
    wert = 0b0001;

habe, und in C schreibe
1
    wert << 1;    //(I.)

dann bekomme ich wert = 0b0010. Nennt sich Bitverschiebung. Klar soweit. 
Jetzt gibt es aber die Verschiebung UND Zuweisung, die folgendermaßen 
aussieht:
1
    wert <<= 1;   //(II.)

Wenn ich zuvor 0b0001 hatte, was steht jetzt in wert??? Es ist ja so, 
dass das die Kurzschreibweise für
1
    wert = wert << 1;    //(III.) = (II.)  [ != (I.) ???]

ist. Ich sehe da nun eigentlich nur eine doppelt gemoppelte Asuführung 
von (I.): die Bits werden um eine Stelle verschoben, und das Ergebnis 
des Werts wird nocheinmal in die selbe Variable geschrieben, wobei ich 
keine weitere Verschiebung vornehme. Wenn ich aber (II.) anwende, ist 
das Ergebnis ein anderes als (I.). Wie wird hier noch was verschoben?

Ich habe schon viele Grundlagen und Skripte durchsucht, und bisher habe 
ich nicht sehen können, dass es eine Unterscheidung gibt. Bzw. sprechen 
die einen von "<< 1 ist Verschiebung um eins nach links" und die anderen 
"<<= 1 ist Verschiebung um eins nach links", was zwar keinen Unterschied 
impliziert, aber offensichtlich doch nicht stimmt. Wo liegt des Pudels 
Kern??

von Nico E. (masta79)


Lesenswert?

wert << 1;
Liefert nur das Ergebniss der Operation zurück "wert" wird dabei nicht 
verändert.Da du keine Zuweisung hast wird das ganze somit verworfen.


wert <<= 1;
Verschiebt das ganze direkt IN "wert".

wert = wert << 1;
Ist effektiv was selbe wie "wert <<= 1". Wird normal vom Compiler auch 
gleich gehandhabt, ausser vlt. bei volatile variablen.

von Tio T. (misterten)


Lesenswert?

Oh,...

hallo Nico, danke für die schnelle Antwort. Ich bin jetzt ein wenig 
verwundert. Dass (I.) das Ergebnis sozusagen wieder verwift, leuchtet 
ein. Ich meinte aber mal (I.) mehrmals funktionierend angewandt zu 
haben, deswegen bin und war ich verwundert. Gut, ich werde ab sofort nur 
noch <<= oder >>= anwenden, dann kann es nicht zu Schwierigkeiten 
kommen.

Habe übrigens grad diesen Link hier 
(http://www.itee.uq.edu.au/~comp2303/Leslie_C_ref/C/CONCEPT/bit_shift.html#shift) 
gefunden. Ich schätze, der sagt wohl was Falsches aus!?

Nochmal danke!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Ich meinte aber mal (I.) mehrmals funktionierend
> angewandt zu haben

Dann nur so:
1
wert = wert << 1;
Und die Kurzschreibweise davon ist halt
1
wert <<= 1;

von Nico E. (masta79)


Lesenswert?

Tio T. wrote:

> Habe übrigens grad diesen Link hier
> 
(http://www.itee.uq.edu.au/~comp2303/Leslie_C_ref/C/CONCEPT/bit_shift.html#shift)
> gefunden. Ich schätze, der sagt wohl was Falsches aus!?

Wieso? Ich kann da jetzt keinen fehler sehen. Es wird halt zweimal um 
jeweils zwei Positionen verschoben. Einmal in der langen und einmal in 
der kurzen Schreibweise.

von Tio T. (misterten)


Lesenswert?

Achso, ich hatte die letzte Zeile nicht als erneuten Operationsaufruf 
verstanden. Dann ist jetzt alles klar. :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.