2013-03-27 5 views
-3

나는 8 자의 std :: string과 드롭 다운 컨트롤의 인덱스 값 (int)을가집니다. 모든 데이터를 저장하는 데 8 바이트 밖에 없습니다.7 바이트에서 8자를 압축

색인 값으로 8 바이트를 절약하기 위해 8 문자를 7 바이트로 압축 할 수 있습니까?

+2

는 다음 네, 가능합니다. – Mysticial

+4

정보를 잃지 않고. –

+0

그들이 ASCII라고 가정하면, 그렇습니다. **하지만 ** ... – Potatoswatter

답변

3

예, 으로 가정하면 문자는 표준 ASCII 문자 집합의 값만 사용합니다.

이 가정이 맞으면 0-127 (즉, 7 비트 값) 만 사용합니다. 따라서 정보는 8 * 7 비트 밖에 없습니다. 그리고 이것을 저장하는 데는 7 * 8 비트가 있습니다. 따라서 각 문자의 MSB를 제거하고 압축하십시오.


그러나 이것은 단일 바이트를 저장하는 엄청난 노력처럼 보입니다. 이 작업을 정말로 수행해야합니까? 모든`char`s이 127 ASCII 경우

+0

그는 8 바이트를 가지고 있으며 7 바이트 컨테이너에 넣기를 원합니다. 문구가 이상합니다 –

+0

@ 0A0D : 그렇습니다. 이것이 ASCII 값의 문자를 사용하는 경우에만 작동하는 이유입니다. –

5
unsigned long long pack(const std::string& s, unsigned index) 
{ 
    return (s[0] & 127) 
     | (s[1] & 127) << 7 
     | (s[2] & 127) << 14 
     | (s[3] & 127) << 21 
     | (s[4] & 127) << 28 
     | (s[5] & 127) << 35 
     | (s[6] & 127) << 42 
     | (s[7] & 127) << 49 
     |  index << 56; 
} 
+0

여기 약간의 문제가 있습니다, UB. ''[]'는'char' 또는'int'를 반환하며'int'에서 1 비트를 뺀 숫자 이상을 이동시킬 수 없습니다. –

+0

어떻게 문자열과 인덱스 값으로 다시 변환 할 수 있습니까? –