2

C++ を使用して、2 つの異なる ID を 1 つの 16 ビット整数に結合する必要があります。その後、この 16 ビット整数を 2 つの元の 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
4

2 に答える 2

12

不可能だよ。

2つの識別子が範囲内にあると仮定すると、[0, 30000]30000 x 30000 =〜2^30の可能な識別子のペアがあります。ただし、可能な16ビット数は2^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;
于 2012-06-14T18:43:41.067 に答える
2

30000未満の2つの数値を組み合わせて、16ビットの小数に詰め込むことはできません。

30,000の一意の可能な値を表現できるようにするには、少なくとも15ビットが必要です(2 ^ 15は32,768です)。

30,000個の一意の可能な値ごとに2つの数値を選択する必要がある場合、可能性の総数は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;
于 2012-06-14T18:44:12.700 に答える