Forum: Compiler & IDEs Was bedeutet der Code


von neuling (Gast)


Lesenswert?

Hey,

frage kann mir jemand erklaeren was der Code bedeutet?

>> uint8_t   mob;
>> uint16_t  maske;
>> for( mob=0; (maske & 0x01)==0; maske >>= 1, ++mob);

Gruss

von Dennis (Gast)


Lesenswert?

Ja, schon etwas tricky...

Google mal nach dem Komma-Operator, der Rest ist eine ganz normale 
For-Schleife :-)

von g457 (Gast)


Lesenswert?

> frage kann mir jemand erklaeren was der Code bedeutet?

Ja, jedes (vernünftige) C-Buch ;-)

Auf den ersten Blick sieht das aus als wollte da jemand versuchen Nullen 
zu zählen.

HTH

von thorsten (Gast)


Lesenswert?

Dieser Code zählt, wie viele Nullen (in binärer Darstellung) vor der 
ersten Eins stehen. Das Ergebnis steht dann in mob.

Vorsicht: Wenn in maske überhaupt keine Eins vorhanden ist, wird dieser 
Code zu einer Endlosschleife!

von neuling (Gast)


Lesenswert?

OK das macht Sinn, danke. Aber was ich bisher nicht finden konnte ist 
folgendes:

maske >>= 1 // bedeutet dass wenn maske größer oder gleich 1 ist?

spaetestens dann frage ich mich, das groesser oder gleich so aussieht 
>=. Wieso dann >>=?

von Maske (Gast)


Lesenswert?

andere Schreibweise: maske = maske >> 1;

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

neuling schrieb:
> Aber was ich bisher nicht finden konnte ist
> folgendes

Daher sollst du dir ja auch ein gutes C-Buch zulegen und durcharbeiten.
Das Zusammenfassen einer Operation mit einer Zuweisung ist in C eine
ziemliche Standardoperation.  Das ist nichts anderes, als man auch bei
1
a += 2;

macht, nur eben mit einer Verschiebung statt einer Addition.

Sowas sollte man aber nach dem Studium des C-Buches wirklich erkennen
können.  Es gibt eigentlich nur zwei Konstrukte in C, die ein wenig
sehr gewöhnungsbedürftig und, naja, auch unübersichtlich sind, dass
man einem Anfänger den unverständlichen Blick verzeiht: der Komma-
Operator und der ternäre Operator (?:).  Beide meidet man daher auch
im "Normalbetrieb", aber sie haben gelegentlich ihre Berechtigung
(wie eben der Kommaoperator in der for-Schleife).

OK, "trigraphs" darfst du außerdem noch schräg angucken ;-), aber
die benutzt wohl ohnehin niemand im realen Leben.  Zumindest habe ich
noch keinen gesehen. :)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

thorsten schrieb:
> Dieser Code zählt, wie viele Nullen (in binärer Darstellung) vor der
> ersten Eins stehen. Das Ergebnis steht dann in mob.

Wobei von rechts gezählt wird, d.h. anfangend mit dem LSB.

Die Funktion gibt es auch als ffs in string.h, z.B.:
http://nongnu.org/avr-libc/user-manual/group__avr__string.html#gab978764fd2814cd14f9f1a3620aa4ca2

ffs liefert allerdings einen um 1 größeren Wert, d.h.
 0 → 0
 1 → 1
 2 → 2
 3 → 1
 4 → 3
 5 → 1
etc.

Die Vorteile der Bibliotheksfunktion sind:

• Man hat keinen kryptischen Code wie oben in der Quelle
• Der Compiler weiß über die Funktion beschreid (zumindest GCC), d.h.
  falls das Argument konstant ist, kann er den Wert direkt einsetzen
  und das Programm muss nicht zur Laufzeit den Wert berechnen.
  Es steht dann also 3 im Code anstatt ffs(4) im Programm berechnen
  zu lassen.

von Michael M. (mikmik)


Lesenswert?

neuling schrieb:
> OK das macht Sinn, danke. Aber was ich bisher nicht finden konnte ist
> folgendes:
>
> maske >>= 1 // bedeutet dass wenn maske größer oder gleich 1 ist?
>
> spaetestens dann frage ich mich, das groesser oder gleich so aussieht
>>=. Wieso dann >>=?

Ich denke er meint was dieses seltsame doppele grösser-als-zeichen hier 
soll.
Das ist kein Vergleichszeichen sondern eine Bitoperation. Hiermit wird 
das Bit in der maske jedesmal nach rechts weitergeschoben.

http://www.mikrocontroller.net/articles/Bitmanipulation

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.