Hallo zusammen, gibt es eigentlich eine Möglichkeit die umgekehrte Operation eines Bitshifts zu machen: Also z.B: byte = ( 1 << 2); /* byte = 00000100b */ hier wurde also ein bit um 2 stellen nach links geshiftet. Mich würde jetzt interessieren ob es möglich ist, wenn byte gegeben ist, rauszufinden um wieviel bit geshiftet wurde. Also man hat z.B: 00000100b und man möchte wissen um wieviel bits hier geshiftet wurde. Konkret heißt das eigentlich von rechts her die erste 1 suchen. Allerdings möchte ich eine derartige suchschleife (while o.ä.) nicht verwenden, sondern mir würde eine Makrolösung viel besser gefallen, ich habe aber keine Idee wie das gehen könnte. Vielleicht kann mir von euch jemand einen Tipp geben wie das zu realisieren wäre. Vielen Dank
Angenommen, im Wert ist immer genau exakt ein einziges Bit gesetzt, so musst Du nur den Logarithmus zur Basis 2 berechnen.
1 | #include<io.h> |
2 | |
3 | #define BITNO(x) ((x & 0x01) ? 0 : \
|
4 | ((x & 0x02) ? 1 : \
|
5 | ((x & 0x04) ? 2 : \
|
6 | ((x & 0x08) ? 3 : \
|
7 | ((x & 0x10) ? 4 : \
|
8 | ((x & 0x20) ? 5 : \
|
9 | ((x & 0x40) ? 6 : \
|
10 | ((x & 0x80) ? 7 : 0xFF))))))))
|
11 | |
12 | |
13 | void test( void ) |
14 | {
|
15 | PORTB = BITNO( 0x01 ); |
16 | PORTB = BITNO( 0x02 ); |
17 | PORTB = BITNO( 0x04 ); |
18 | PORTB = BITNO( 0x08 ); |
19 | PORTB = BITNO( 0x10 ); |
20 | PORTB = BITNO( 0x20 ); |
21 | PORTB = BITNO( 0x40 ); |
22 | PORTB = BITNO( 0x80 ); |
23 | }
|
Es wird nur das niedrigste gesetzte Bit ausgewertet, ist kein Bit gesetzt, wird 0xFF zurückgegeben. Peter
Wenn du wirklich nur die Umkehrung von 1<<n suchst, nennt sich das "find first set", und ist als Funktion ffs() in vielen Bibliotheken (so auch in der avr-libc) zu finden. Als Makro, d. h. zur Compilezeit berechnet, ist es _FFS().
Hallo, vielen Dank für die Antworten, das bringt mich auf jeden Fall schon ein bisschen weiter.
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.