Ad
  • Custom User Avatar

    I'm assuming you're asking about the left bit (aka binary) shift operators <<

    It can be confusing at first, because the same operator is overloaded by e.g. stringstream to append things to the stream.
    But originally the << and >> operators shift bits in an integer. Combined with & (and) operation, it is used here to extract 8 bit parts of the original 32 bit number.

    Take a look here https://www.educative.io/answers/what-are-bit-shift-operations . And here https://www.tutorialspoint.com/cplusplus/cpp_operators.htm .

    Given an uint32_t variable ip, you can extract four 8 bit chunks like that:

    uint8_t a = ip >> 24; // basically discard rightmost 24 bits and we're left with the leftmost 8 bits
    uint8_t b = (ip >> 16) & 0xFF; // get rid of 16 rightmost bits, and use & to mask out the 8 leftmost bits
    uint8_t c = (ip >> 8) & 0xFF; // as above, but we discard 8 rightmost bits
    uint8_t d = ip & 0xFF; // no bit shifts - the bits are in the right place, we just need to get rid of leftmost 24 bits by masking them
    

    To reverse it:

    ip = (a << 24) + (b << 16) + (c << 8) + d;
    

    Hope that helps :)

  • Custom User Avatar

    I love it - a very concise and elegant solution. Quite easy to follow.

  • Custom User Avatar

    I love the use of initializer list for r, g and b. Lovely stuff :)
    This is peak C++17 for me.