2012-06-14 4 views
0

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 
+5

정보 이론은 일반적인 경우에는 불가능하다고 말합니다. 식별자의 최대 값이 30000이면 저장소에 각각 15 비트가 필요합니다. 함께 그들은 30 비트의 정보를 제공합니다. 30 비트 정보를 16 비트 정수로 압축 할 수 없습니다. – HighCommander4

+0

이 숙제가 있습니까? – Dhara

+0

최대 30k가 필요하면 32 비트 결과를 사용하는 것이 좋습니다. – chris

답변

9

이 불가능하다.

두 개의 식별자가 [0, 30000] 범위에 있다고 가정하면 30000 x 30000 = ~ 2^30 개의 가능한 식별자 쌍이있을 수 있습니다. 그러나 2^16 개의 가능한 16 비트 숫자 만 있습니다. 따라서 식별자 쌍을 16 비트 정수로 매핑 할 수 없으며 식별자 쌍을 16 비트 정수로 복구 할 수 있습니다.

인코딩 :

unsigned short Identifier1 = 12793; 
unsigned short Identifier2 = 5450; 
unsigned int CombinedIDs = (Identifier1 << 16) | Identifier2; 

디코딩 :


대신, 두 인코딩 및 디코딩이 간단이 경우 조합을 저장하는 32 비트 정수를 사용하여

unsigned short Identifier1 = CombinedIDs >> 16; 
unsigned short Identifier2 = CombinedIDs & 0x0000FFFF 

식별자의 범위가 [0, 30000] 인 제한 사항은 n이 아니므로 ecessary - 부호없는 short 값입니다.


편집 의견을 응답 : 4, 12 비트 가능합니다.

인코딩 :

unsigned short Identifier1; // 4 bits 
unsigned short Identifier2; // 12 bits 
unsigned short CombinedIDs = (Identifier1 << 12) | Identifier2; 

디코딩 : 당신은 16 비트 진수로 30000 물건을보다 두 숫자를 결합 할 수 없습니다

unsigned short Identifier1 = CombinedIDs >> 12; 
unsigned short Identifier2 = CombinedIDs & 0x0FFF; 
+0

4 비트 및 12 비트 정수를 하나로 결합하고 나중에 디코딩하는 방법을 알려주시겠습니까?적어도 2 개의 8 비트 정수의 경우는 가능하지 않습니다. 고맙습니다. –

+0

@MarcusFrenkel : 4 비트와 12 비트가 가능합니다. 내 편집을 참조하십시오. – HighCommander4

+0

@ HighCommander4 많은 도움을 주셔서 감사합니다. –

2

.

30,000 개의 고유 한 값을 표현하려면 적어도 15 비트 (2^15는 32,768)가 필요합니다.

30,000 개의 고유 한 가능한 값이있는 두 개의 숫자를 선택해야하는 경우 총 가능한 수는 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; 
+0

고맙습니다. 이전 답장이 먼저 왔으니 그 대답을 받아 들일 필요가 있습니다. –

관련 문제