使用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
Run Code Online (Sandbox Code Playgroud)
这是不可能的.
假设您的两个标识符可以在该范围内[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;
Run Code Online (Sandbox Code Playgroud)
解码:
unsigned short Identifier1 = CombinedIDs >> 16;
unsigned short Identifier2 = CombinedIDs & 0x0000FFFF
Run Code Online (Sandbox Code Playgroud)
请注意,现在标识符在[0,30000]范围内的限制不是必需的 - 它们是任何无符号的短值.
编辑回答您的评论:4位和12位是可能的.
编码方式:
unsigned short Identifier1; // 4 bits
unsigned short Identifier2; // 12 bits
unsigned short CombinedIDs = (Identifier1 << 12) | Identifier2;
Run Code Online (Sandbox Code Playgroud)
解码:
unsigned short Identifier1 = CombinedIDs >> 12;
unsigned short Identifier2 = CombinedIDs & 0x0FFF;
Run Code Online (Sandbox Code Playgroud)