Forum: Compiler & IDEs Umkehrung von bit shift


von mac (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Angenommen, im Wert ist immer genau exakt ein einziges Bit gesetzt, so
musst Du nur den Logarithmus zur Basis 2 berechnen.

von Peter D. (peda)


Lesenswert?

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

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


Lesenswert?

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().

von Christian Rötzer (Gast)


Lesenswert?

An dieser stelle auch gerne genannt:

http://aggregate.org/MAGIC/#Most Significant 1 Bit

von mac (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.