Byte umdrehen

Gast #75858
Lesenswert?
• ▲
▼
Hi,

Der C-Code ist nicht effektiv, Ich wollte damals nur keinen Assembler
mit einbinden.

uint8_t
mirrorbyte(uint8_t value) {
  uint8_t ret=0, i;
  for (i=0x80; i ; i>>=1) {
    if (value & 0x01)
      ret |= i;
    value >>= 1;
  }
  return ret;
}

mfg
werner
Gast #75859
Lesenswert?
• ▲
▼
Also XOR tuts nicht.
Das dreht die Polarität um, aber nicht die Bitreihenfolge.

Wie willst Du es denn machen? Mit Assembler oder in C?

In Assembler würde ich 2 Register über das Carry rotieren lassen:

Das Byte, was geändert werden soll, steht in R16, das Ergebnis später
in R17:

   rol   R16      ;Bit 7 von R16 ins Carry
   ror   R17      ;Carry in Bit 7 von R17

.. und diese 2 Befehle 8 mal wiederholen.

In C geht es natürlich auch ...

Stefan
Gast #75860
Lesenswert?
• ▲
▼
Hallo,

danke fuer die Tipps. Ich habe noch folgendes ergooglet:

   n = ((n >>  1) & 0x55555555) | ((n <<  1) & 0xaaaaaaaa);
   n = ((n >>  2) & 0x33333333) | ((n <<  2) & 0xcccccccc);
   n = ((n >>  4) & 0x0f0f0f0f) | ((n <<  4) & 0xf0f0f0f0);
   n = ((n >>  8) & 0x00ff00ff) | ((n <<  8) & 0xff00ff00);
   n = ((n >> 16) & 0x0000ffff) | ((n << 16) & 0xffff0000);

Werde morgen mal schauen, was am schnellsten durchlaeuft.

Gruss,
Dirk
Gast #75861
Lesenswert?
• ▲
▼
Die Diskussion hatten wir schon mal in de.sci.electronics.

Die Variante mit der Schleife ist die codesparendste.  Für 8 bit ist
sie vermutlich auch mit die schnellste, für 32 bit braucht sie schon
recht lange.

Interessant ist dieser Trick aus der BSD fortune database:

   n = ((n >>  1) & 0x55555555) | ((n <<  1) & 0xaaaaaaaa);
   n = ((n >>  2) & 0x33333333) | ((n <<  2) & 0xcccccccc);
   n = ((n >>  4) & 0x0f0f0f0f) | ((n <<  4) & 0xf0f0f0f0);
   n = ((n >>  8) & 0x00ff00ff) | ((n <<  8) & 0xff00ff00);
   n = ((n >> 16) & 0x0000ffff) | ((n << 16) & 0xffff0000);

                -- C code which reverses the bits in a word.

...nur falls es mal jemand für paar Bits mehr braucht. ;-)

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.