2010-04-01 111 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