使用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
答案 0 :(得分: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]范围内的限制不是必需的 - 它们是任何无符号的短值。
编辑回答你的评论: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;
答案 1 :(得分: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;