0

So I was looking how to get a list of RGB colors depending on a desired total of colors to retrieve and I found this piece of code. And there's a part that I can't understand, I already read the notes where the ">>" and "&" operators are bitwise operators but I can't fully understand what they are doing.

Can anybody help me on understanding the part where the colors values are been assigned?

def getDinstinctRGBColorsList(desiredColors)
    availableColors = 16000000
    inc = availableColors/desiredColors
    colorsList = {}
    RGB = 0
    count = 0
    while count <= desiredColors:
        RGB = RGB+inc
        colorBlue = RGB & 255
        colorGreen = (RGB >> 8) & 255
        colorRed = (RGB >> 16) & 255
        colorsList[count] = str(colorRed) + "," + str(colorGreen) + "," + str(colorBlue)
        count += 1
    return colorsList
john-bright
  • 43
  • 2
  • 8
  • `&` is bitwise and operator. `>>` is bitwise right shift operator. They are both [documented here](https://wiki.python.org/moin/BitwiseOperators) which you can find with simple search. – mhawke Nov 30 '17 at 02:20

1 Answers1

1

See BitwiseOperators and What are bitwise shift (bit-shift) operators and how do they work?.

From the code you posted, it looks like RGB contains 24 bits of color information: 8 bits for red, 8 bits for green, and 8 bits for blue with the red data in the left most 8 bits, the green data in the middle 8 bits, and the blue data in the right most 8 bits.

Imagine the bits of RGB look like 0brrrrrrrrggggggggbbbbbbbb where r is a bit for the red value, g is a bit for the green value, and b is a bit for the blue value.

Note that 255 in binary is 0b11111111 (8 set bits).

colorGreen = (RGB >> 8) & 255 is extracting the middle 8 bits that represent green using >> (right shift) and & (bitwise and):

0brrrrrrrrggggggggbbbbbbbb >> 8 yields 0b00000000rrrrrrrrgggggggg

Note how the bits for green are now the left-most 8 bits. However, the bits for red are still present.

0b00000000rrrrrrrrgggggggg & 0b00000000000000001111111 yields 0b0000000000000000gggggggg

Note how only the bits for green remain.

Edit: This is a simplification. In Python, >> is an arithmetic shift, not a logical shift. An arithmetic shift preserves sign. See What are bitwise shift (bit-shift) operators and how do they work? for a more detailed explanation.

Galen
  • 1,307
  • 8
  • 15