将两个整数合并成一个整数,然后解码 使用C++,我需要将两个不同的ID组合成一个16位整数。然后稍后我需要将这个16位整数解码为两个原始ID值

将两个整数合并成一个整数,然后解码 使用C++,我需要将两个不同的ID组合成一个16位整数。然后稍后我需要将这个16位整数解码为两个原始ID值,c++,integer,C++,Integer,例如: // 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 // Dec

例如:

// 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,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;  // 4 bits
unsigned short Identifier2;  // 12 bits
unsigned short CombinedIDs = (Identifier1 << 12) | Identifier2;
请注意,现在没有必要限制标识符在[0,30000]范围内-它们可以是任何无符号的短值


编辑回答您的评论:4位和12位是可能的

编码:

unsigned short Identifier1 = 12793;
unsigned short Identifier2 = 5450;
unsigned int CombinedIDs = (Identifier1 << 16) | Identifier2;
unsigned short Identifier1;  // 4 bits
unsigned short Identifier2;  // 12 bits
unsigned short CombinedIDs = (Identifier1 << 12) | Identifier2;
这是不可能的

假设您的两个标识符可以在范围
[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;  // 4 bits
unsigned short Identifier2;  // 12 bits
unsigned short CombinedIDs = (Identifier1 << 12) | Identifier2;
请注意,现在没有必要限制标识符在[0,30000]范围内-它们可以是任何无符号的短值


编辑回答您的评论:4位和12位是可能的

编码:

unsigned short Identifier1 = 12793;
unsigned short Identifier2 = 5450;
unsigned int CombinedIDs = (Identifier1 << 16) | Identifier2;
unsigned short Identifier1;  // 4 bits
unsigned short Identifier2;  // 12 bits
unsigned short CombinedIDs = (Identifier1 << 12) | Identifier2;

你不能把两个小于30000的数字合并成16位的小数

要能够表示30000个唯一的可能值,您至少需要15位(2^15是32768)

如果必须选择每个30000个唯一可能值的两个数字,则可能的总数为900000000,这至少需要30位(2^30为1073741824)

尝试使用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;
无符号短标识符1=29999;
无符号短标识符2=1;
无符号整数组合=标识符116;
unsigned short extracted2=组合&0xffff;

不能将两个小于30000的数字组合成16位小数

要能够表示30000个唯一的可能值,您至少需要15位(2^15是32768)

如果必须选择每个30000个唯一可能值的两个数字,则可能的总数为900000000,这至少需要30位(2^30为1073741824)

尝试使用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;
无符号短标识符1=29999;
无符号短标识符2=1;
无符号整数组合=标识符116;
unsigned short extracted2=组合&0xffff;

信息论告诉我们,这在一般情况下是不可能的。如果标识符的最大值为30000,则每个标识符需要15位来存储。它们总共包含30位信息。你不能把30位信息压缩成16位整数。如果你需要30K最大值,我会考虑使用32位结果。这不是一个家庭作业。我需要将两个ID存储到IP数据包中某个位置的16位整数-2字节中。@MarcusFrenkel:仍然不可能。最大数量100需要7位,30000需要15位。这总共是22位,仍然超过16位。如果这是可能的话,那就太好了,因为通过反复应用这一原理,任何计算机都可以只存储一个字。信息理论告诉我们,在一般情况下,这是不可能的。如果标识符的最大值为30000,则每个标识符需要15位来存储。它们总共包含30位信息。你不能把30位信息压缩成16位整数。如果你需要30K最大值,我会考虑使用32位结果。这不是一个家庭作业。我需要将两个ID存储到IP数据包中某个位置的16位整数-2字节中。@MarcusFrenkel:仍然不可能。最大数量100需要7位,30000需要15位。总共是22位,仍然超过16位。如果这是可能的话,那就太好了,因为通过反复应用这一原理,任何计算机都可以只使用一个字的存储。你能告诉我如何将4位和12位整数组合成一个,然后再对其进行解码吗?如果不可能,那么至少是两个8位整数的情况。谢谢。你能告诉我如何将4位和12位整数合并成一个整数,然后解码吗?如果不可能,那么至少是两个8位整数的情况。谢谢,谢谢。之前的回复是第一个,所以我需要接受这个回复。谢谢。之前的答复是先来的,所以我需要接受这个答复。