2010-04-01 122 views
3

说我有一个整数,13941412,我希望分成字节(数字实际上是0x00bbggrr形式的颜色)。你会怎么做?在c中,您将数字转换为BYTE,然后移位。你如何在Python中转换为字节?整数到字节转换

+0

'hex(13941412)'会够吗? – kennytm 2010-04-01 17:31:56

+0

我想要每种颜色的编号。十六进制返回一个str对象。感觉不到最佳。 – quano 2010-04-01 17:40:42

回答

13

使用按位数学运算,将“字节”已经存在:

def int_to_rgb(n): 
    b = (n & 0xff0000) >> 16 
    g = (n & 0x00ff00) >> 8 
    r = (n & 0x0000ff) 
    return (r, g, b) 
+0

谢谢,这个伎俩! – quano 2010-04-01 17:42:20

2

你可以用0xff按位&得到第一个字节,然后移动8位并重复以获得其他3个字节。

编辑:对于颜色,你知道你需要最不重要的三个字节。所以,你可以使用一个更好的办法:

r = num & 0x0000ff 
g = (num & 0x00ff00) >> 8 
b = (num & 0xff0000) >> 16 
+0

为了只提取每种颜色的字节,使用msw的方法会更简单。我将留下这篇文章作为一个拉出字节的一般方法。 – 2010-04-01 17:37:33

+0

这样,除第一个字节外的所有字节都变为0。如果我转移它。 – quano 2010-04-01 17:37:50

+0

您需要将中间结果存储在变量中。用msw的解决方案。 – 2010-04-01 17:41:38

0

下面是适用于任何语言的优化方案,并且不伤害易读性。

取而代之的是:

b = (n & 0xff0000) >> 16 
g = (n & 0xff00) >> 8 
r = (n &  0xff) 

使用本:

b = (n >> 16) & 0xff 
g = (n >> 8) & 0xff 
r = n  & 0xff 

两个原因:

有更少的常量不慢,而且可能会更快。

具有较小的常量不会更慢,并且可能更快 - 在像C这样的语言中,较短的机器指令可能是可用的;在像Python这样的语言中,实现可能会汇集小整数。

+0

出于某种原因,您的建议在我的机器上运行速度比msw慢5%左右 – 2012-07-11 00:16:59