2

使用 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
4

2 回答 2

12

这是不可能的。

假设您的两个标识符可以在范围内[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] 范围内 - 它们是任何无符号短值。


编辑回答您的评论: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;
于 2012-06-14T18:43:41.067 回答
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;
于 2012-06-14T18:44:12.700 回答