I have two functions, one to return RGB values from a given Integer, and the other function does the reverse, providing it with RGB values it returns an Integer. I'm testing this by seeing if the integer i convert to RGB turns back from RGB into the original integer value, but I'm getting different values.
def getRGBfromI(RGBint):
blue = RGBint & 255
green = (RGBint >> 8) & 255
red = (RGBint >> 16) & 255
return red, green, blue
def getIfromRGB(rgb):
red = rgb[0]
green = rgb[1]
blue = rgb[2]
print red, green, blue
RGBint = (red<<16) + (green<<8) + blue
return RGBint
the test:
i1 = 2147483647
colr1 = getRGBfromI(i1)
print colr1 # returns (255,255,255)
i2 =getIfromRGB(colr1)
print i1, i2 # returns 2147483647 16777215
To me it seems like the getRGBfromI() is correct and the getIfromRGB() is incorrect, but I may be wrong about that too.
Both functions seem to be working fine.
The max value expressed by a 24 bit integer (forget the sign for now) is
So
is higher than
mx
andcorrectly gives
since it cuts out the bits higher than 24 (0xFFFFFF occupies bits from 0 to 23)
Viceversa,
correctly gives
which is the max value you can represent with 24 bits (i.e. the
mx
above).If you pour 1.4 litres of water in a 1L bottle, some water will be lost in the overflow. When you empty the bottle, you will find 1L at max
There's nothing wrong with your code. The values are different, because you are giving 2147483647 as input, which, translated to hexadecimal, gives
0x7FFFFFFF
as an output. On the other hand, 16777215 is0xFFFFFF
in hexadecimal, so you understand there is nothing wrong with your code actually, apart from the fact that you are giving such a big decimal number as an input.You can test this if you type: