2012-06-14 61 views
0

使用C++我需要將兩個不同ID組合爲一個16位整數。然後,我需要將這個16位整數解碼爲兩個原始ID值。將兩個整數合併爲一個並稍後解碼

實施例:

// Store two integers into one 
unsigned short Identifier1 = 12793; //(maximum number 30000) 
unsigned short Identifier1 = 5450; //(maximum number 30000) 
unsigned short CombinedIDs = 34283; // this is example, I don't know the code for that 

// Decode one integer into two 
// At this point I only have CombinedIDs value, I need to extract it 
// into the two original IDs 

unsigned short OriginalIdentifier1 = ...CombinedIDs.. code to get 12793 
unsigned short OriginalIdentifier2 = ...CombinedIDs.. code to get 5450 
+5

信息論告訴我們,在一般情況下這是不可能的。如果您的標識符的最大值爲30000,那麼它們需要每個存儲15位。它們共同包含30位信息。您不能將30位信息壓縮成16位整數。 – HighCommander4

+0

這是功課嗎? – Dhara

+0

如果您需要最大30k,我會考慮使用32位結果。 – chris

回答

9

這是不可能的。

假設您的兩個標識符可以在[0, 30000]範圍內,則有30000 x 30000 =〜2^30個可能的標識符對。但是,只有2^16個可能的16位數字。因此,您不可能將標識符對映射到16位整數,並期望從中恢復標識符。


相反,可以使用32位整數來存儲組合,在這種情況下編碼和解碼是簡單的:

編碼:

unsigned short Identifier1 = 12793; 
unsigned short Identifier2 = 5450; 
unsigned int CombinedIDs = (Identifier1 << 16) | Identifier2; 

解碼:

unsigned short Identifier1 = CombinedIDs >> 16; 
unsigned short Identifier2 = CombinedIDs & 0x0000FFFF 

請注意,現在標識符在[0,30000]範圍內的限制不是n必要 - 他們是任何未簽名的短期價值。


編輯回答您的評論:4個12位是可能的。

編碼:

unsigned short Identifier1; // 4 bits 
unsigned short Identifier2; // 12 bits 
unsigned short CombinedIDs = (Identifier1 << 12) | Identifier2; 

解碼:

unsigned short Identifier1 = CombinedIDs >> 12; 
unsigned short Identifier2 = CombinedIDs & 0x0FFF; 
+0

你能告訴我如何將4位和12位整數合併成一個並稍後解碼?如果這是不可能的,那麼至少是兩個8位整數的情況。謝謝。 –

+0

@MarcusFrenkel:4位和12位是可能的。看我的編輯。 – HighCommander4

+0

非常感謝@ HighCommander4,這非常有幫助。 –

2

不能低於30000和東西兩個數合併成一個16位的小數。

爲了能夠表達30,000個唯一可能的值,您至少需要15位(2^15是32,768)。

如果您必須選擇每個30,000個唯一可能值的兩個數字,則可能的總數是900,000,000,這需要至少30位(2^30是1,073,741,824)。

嘗試使用int。

unsigned short Identifier1 = 29999; 
unsigned short Identifier2 = 1; 
unsigned int combined = identifier1<<16 + identifier2; 

unsigned short extracted1 = (combined & 0xffff0000)>>16; 
unsigned short extracted2 = combined & 0xffff; 
+0

謝謝。之前的回覆是第一個,所以我需要接受那個。 –