【发布时间】:2012-06-14 18:38:37
【问题描述】:
使用 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
【问题讨论】:
-
信息论告诉我们,这在一般情况下是不可能的。如果您的标识符的最大值为 30000,那么它们每个需要 15 位来存储。它们一起包含 30 位信息。不能将 30 位信息压缩成 16 位整数。
-
如果您需要最大 30k,我会考虑使用 32 位结果。
-
这不是作业。我需要将两个 ID 存储到一个 16 位整数中 - 2 个字节,位于 IP 数据包中的某个位置。
-
@MarcusFrenkel:仍然不可能。最大数量 100 需要 7 位,30000 需要 15 位。加起来是 22 位,仍然超过 16 位。
-
如果可以的话那就太好了,因为重复应用这个原理,任何一台电脑只要一个存储字就能搞定。