2015-11-01 40 views
2

給定一個無符號整數,我需要以6位長的十六進制值結束。C++ trim和pad無符號整數,十六進制爲#RGB值

  • 81892(己烷:13FE4),應成爲13FE40013FE4
  • 3285446057(己烷:C3D3EDA9),應成爲C3D3EDD3EDA9

由於我參與的項目使用Qt,我通過這種方式解決了這個問題:

unsigned int hex = qHash(name); 
QString hexStr = (QString::number(hex, 16) + "000000").left(6); 
bool ok; 
unsigned int hexPat = hexStr.toUInt(&ok, 16); 

這填充右邊的十六進制數字串,然後從左邊的第六個字符後修剪它。做相反,我想簡單地更換的第二行:

QString hexStr = ("000000" + QString::number(hex, 16)).right(6); 

的值將是used for RGB values,這就是爲什麼我需要六個十六進制數字(0和255之間的三個值)。

是否有更高效的方法來實現這些結果(或兩者)而不轉換爲字符串,然後返回?

回答

2

您的問題的實際需求是給定一個無符號整數,您需要提取三個字節。

確實沒有任何需要轉換爲字符串來提取它們,它可以更有效地執行位操作。

爲了提取從整數的任何字節,右移位(>>)對應的數字比特(0,8,16或24),和AND用掩模的結果只需要最右邊的字節(0xFF的,這真的是0x000000FF)。

例如拿三個最顯著字節:

uint c = hash(...); 
BYTE r = (BYTE)((c >> 16) & 0xFF); 
BYTE g = (BYTE)((c >> 8) & 0xFF); 
BYTE b = (BYTE)(c & 0xFF); 

或三個最顯著字節:

uint c = hash(...); 
BYTE r = (BYTE)((c >> 24) & 0xFF); 
BYTE g = (BYTE)((c >> 16) & 0xFF); 
BYTE b = (BYTE)((c >> 8) & 0xFF); 
+0

BYTE在http://stackoverflow.com/a/20025042/188159?我可以使用int還是unsigned int來避免包含任何內容並定義新類型? (我覺得我應該那樣做,因爲我幾乎不知道我貢獻的項目,可能還不知道這樣的增加對性能和其他代碼段可能會有什麼影響)PS:謝謝你重申我的問題,這是非常有助於理解過程。 – qubodup

+0

對不起,我已經習慣了Windows,我忘了它不是該語言的一部分。 'BYTE'被定義爲'unsigned char'。它也許可以工作,儘管不太具體,用int或uint,取決於值以後需要去的地方。 – Rotem

+0

謝謝澄清。我特別感興趣的是使用最重要的字節(左邊的部分),但不幸的是你的代碼似乎不能處理短散列。 1cf9e變爲00,01,而不是1c,f9,e0和ef變爲00,00,00而不是ef,00,00 http://rextester.com/PGV72502(使用unsigned char而不是unsigned int時也會發生) - 我也擔心這可能是32位/ 64位操作系統之間不一致? – qubodup

相關問題