我有两个函数,一个用于返回给定Integer的RGB值,另一个函数反向执行,为其提供RGB值,返回一个Integer。我通过查看转换为RGB的整数是否从RGB转回原始整数值来测试这个,但我得到的值不同。
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
测试:
i1 = 2147483647
colr1 = getRGBfromI(i1)
print colr1 # returns (255,255,255)
i2 =getIfromRGB(colr1)
print i1, i2 # returns 2147483647 16777215
对我而言,似乎getRGBfromI()是正确的并且getIfromRGB()是不正确的,但我也可能是错的。
答案 0 :(得分:9)
这两个功能似乎都运行良好。
由24位整数表示的最大值(暂时忘记符号)是
mx = pow(2,24)-1 # i.e. 16777215
所以
i1 = 2147483647
高于mx
和
colr1 = getRGBfromI(i1)
正确给出
(255, 255, 255) # better to view it in hex as 0xFFFFFF
因为它会切掉高于24的位(0xFFFFFF占用从0到23的位)
反之亦然,
i2 = getIfromRGB(colr1)
正确给出
16777215
这是您可以用24位表示的最大值(即上面的mx
)。
如果在1L瓶中倒入1.4升水,溢流中会有一些水流失。 当你清空瓶子时,你会发现最大1L
答案 1 :(得分:4)
您的代码没有任何问题。值不同,因为您将 2147483647 作为输入,转换为十六进制,给出0x7FFFFFFF
作为输出。另一方面, 16777215 在十六进制中是0xFFFFFF
,所以你明白你的代码实际上没有任何问题,除了你提供这样的事实一个大十进制数作为输入。
如果您输入:
,则可以对此进行测试print i1 & 0xFFFFFF, i2 # this will return equal values