mikrocontroller.net

Forum: Compiler & IDEs Umkehrung von bit shift


Autor: mac (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include<io.h>

#define BITNO(x) ((x & 0x01) ? 0 : \
                 ((x & 0x02) ? 1 : \
                 ((x & 0x04) ? 2 : \
                 ((x & 0x08) ? 3 : \
                 ((x & 0x10) ? 4 : \
                 ((x & 0x20) ? 5 : \
                 ((x & 0x40) ? 6 : \
                 ((x & 0x80) ? 7 : 0xFF))))))))


void test( void )
{
  PORTB = BITNO( 0x01 );
  PORTB = BITNO( 0x02 );
  PORTB = BITNO( 0x04 );
  PORTB = BITNO( 0x08 );
  PORTB = BITNO( 0x10 );
  PORTB = BITNO( 0x20 );
  PORTB = BITNO( 0x40 );
  PORTB = BITNO( 0x80 );
}

Es wird nur das niedrigste gesetzte Bit ausgewertet, ist kein Bit
gesetzt, wird 0xFF zurückgegeben.


Peter

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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().

Autor: Christian Rötzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An dieser stelle auch gerne genannt:

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

Autor: mac (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

vielen Dank für die Antworten, das bringt mich auf jeden
Fall schon ein bisschen weiter.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.