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
Ja, schon etwas tricky... Google mal nach dem Komma-Operator, der Rest ist eine ganz normale For-Schleife :-)
> 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
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!
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 >>=?
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. :)
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.