将两个整数合并为一个并稍后解码

Mar*_*kel 0 c++ integer

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

HC4*_*ica 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;
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)