Die Mittleren 4 bit umdrehen



  • Hallo zusammen.
    Ich muss für mein projekt die Reihenfolge der mittleren vier Bit umdrehen.

    Also sozusagen aus 12345678 soll 12654378 werden.

    Wie realisiere ich das am besten?

    mein ansatz bisher sieht folgerndermaßen aus:

    char byte; //hier steht das byte, dessen bit getausch werden
    char tmp; //Platzhalter definieren
    tmp = byte & 0x3C; //die vier 'randbit' ausblenden
    tmp = mirrorbyte(tmp); //alles tauschen. aus 00abcd00 wird 00dcba00
    byte = byte & 0xC3; //die mittleren 4 bit ausblende
    byte = byte & tmp; //beide byte wieder zusammenfügen
    
    char mirrorbyte(char value) { //funktion um ein byte zu "wenden"
      char ret=0, i;
      for (i=0; i<=7 ; i++) {
        if (value & 0x01)
          ret |= i;
        value >>= 1;
      }
      return ret;
    }
    

    Ist das so In ordnung oder gibt es noch eine bessere/elegantere/schnellere möglichkeit?

    Mfg Eichhorn



  • lookup table?



  • Du musst das bitweise Or ( | ) verwenden, um tmp und byte wieder zusammenzufügen.

    Und falls du kürzer als eleganter empfindest:

    byte=(byte&0xC3) | mirrorbyte(byte&0x3C);
    

    Und mirrorbyte geht in der Tat auch schneller, guckst du dazu hier (und dort etwas tiefer):
    http://graphics.stanford.edu/~seander/bithacks.html#BitReverseObvious



  • Wenn dir ein 256-teiliger Lookup Table zu sperrig ist, könntest du es auch so machen:

    static const unsigned char lookup[16] = {
        0x00, 0x20, 0x10, 0x30, 0x08, 0x28, 0x18, 0x38,
        0x04, 0x24, 0x14, 0x34, 0x0c, 0x2c, 0x1c, 0x3c };
    
    unsigned char newbyte = (byte & 0xc3) | lookup[(byte & 0x3c) >> 2];
    

Log in to reply