2012-06-14 59 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

谢谢。之前的回复是第一个,所以我需要接受那个。 –