Search code examples
cbit-manipulationrgbbit-shift

Swap first and last 5 bits in a 16-bit number


I have some C/C++ code where I have a 16-bit number (uint16_t), and I need to swap the first 5 bits with the last 5 bits, keeping their left-to-right order within each block of 5 bits. The middle 6 bits need to remain intact. I am not great at bitwise maths/operations so help would be appreciated!

Conceptually speaking, the switching of positions would look like:

ABCDEFGHIJKLMNOP becomes LMNOPFGHIJKABCDE

or more literally...

10101000000001010 becomes 0101000000010101.

Any help would be much appreciated!


Solution

  • First, you should check if whatever library you use doesn't have a RGB-BGR swap for R5G6B5 pixels already.

    Here is a literal translation of what you wrote in your question. It is probably too slow for real-time video:

    uint16_t rgbswap(uint16_t in) {
        uint16_t r = (in >> 11) & 0b011111;
        uint16_t g = (in >> 5)  & 0b111111;
        uint16_t b = (in >> 0)  & 0b011111;
    
        return b << 11 | g << 5 | r << 0;
    }