Bitfolge in Byte spiegeln



  • Hallo, ich versuche für ein Mikrocontroller Projekt ein BMP in eine Tabelle zu bringen, um dieses dann auf einem LCD auszugeben. 8 bits eines Datenbytes stehen immer 8 aufeinanderfolgende Pixel (an/aus) in einer Zeile. Nun habe ich das Problem, dass mein Display das Tiefste Bit eines Bytes genau auf der anderen Seite anzeigt, als das Bit in der Monochrom BMP steht. Ich müsste jedes Byte z.B 00101111 genau spiegeln können, wäre in dem Beispiel dann 11110100. Habe schon gedacht über eine switch Tabelle, um jedoch 254 Zustände zu Spiegeln, fehlt mir erlich gesagt der Spass. Auf dem Mikrocontroller möchte ich ebenfalls nicht Spiegeln, da dort die Leistung etwas eingeschränkt ist.



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    noobc schrieb:

    Hallo, ich versuche für ein Mikrocontroller Projekt ein BMP in eine Tabelle zu bringen, um dieses dann auf einem LCD auszugeben. 8 bits eines Datenbytes stehen immer 8 aufeinanderfolgende Pixel (an/aus) in einer Zeile. Nun habe ich das Problem, dass mein Display das Tiefste Bit eines Bytes genau auf der anderen Seite anzeigt, als das Bit in der Monochrom BMP steht. Ich müsste jedes Byte z.B 00101111 genau spiegeln können, wäre in dem Beispiel dann 11110100. Habe schon gedacht über eine switch Tabelle, um jedoch 254 Zustände zu Spiegeln, fehlt mir erlich gesagt der Spass. Auf dem Mikrocontroller möchte ich ebenfalls nicht Spiegeln, da dort die Leistung etwas eingeschränkt ist.

    Kapier bestenfalls die Hälfte. Was willst du von uns?



  • 00101111 XOR 11111111 ist doch 11110100. Oder bin ich jetzt falsch?





  • ups. so rum gespiegelt 🤡



  • ja ähm, du bist jetzt falsch, denn 1 xor 1 = 0 xor 0 = 0
    von Ney



  • EDIT: Opps, sorry, im Link von Tim steht ja schon alles 🙂 Hätte mal vorher lesen sollen... *pfeiff* Ich lass es trotzdem stehen, falsch isses ja nicht.

    @noobc:

    namespace {
    unsigned char reverse_table[256] = {0};
    
    void init_table()
    {
        for (unsigned i = 0; i < 256; i++)
        {
            unsigned v = 0;
            for (unsigned b = 0; b < 8; b++)
            {
                if (i & (1 << b))
                    v |= (1 << (7 - b));
            }
            reverse_table = static_cast<unsigned char>(v);
        }
    }
    
    } // namespace
    
    void bit_reverse_byte_block(unsigned char* p, size_t l)
    {
        if (reverse_table[1] == 0) // nicht threadsafe!
            init_table();
    
        while (l--)
        {
            *p = reverse_table[*p];
            p++;
        }
    }
    

    Lässt sich natürlich auch ohne lookup-table lösen, allerdings dürfte das deutlich langsamer sein.
    Wenn die 256 Byte für den Table kritisch sind (könnten sie ja sein wenns auf nem kleinen Mikrokontroller laufen muss), dann halt so:

    void bit_reverse_byte_block(unsigned char* p, size_t l)
    {
        while (l--)
        {
            unsigned char c = *p;
            *p = ((c & 1) << 7)
                | ((c & 2) << 5)
                | ((c & 4) << 3)
                | ((c & 8) << 1)
                | ((c & 16) >> 1)
                | ((c & 32) >> 3)
                | ((c & 64) >> 5)
                | ((c & 128) >> 7);
            p++;
        }
    }
    


  • Danke für die rege Antwortmasse, nun gehts einwandfrei. 😉


Anmelden zum Antworten