나는 8 자의 std :: string과 드롭 다운 컨트롤의 인덱스 값 (int)을가집니다. 모든 데이터를 저장하는 데 8 바이트 밖에 없습니다.7 바이트에서 8자를 압축
색인 값으로 8 바이트를 절약하기 위해 8 문자를 7 바이트로 압축 할 수 있습니까?
나는 8 자의 std :: string과 드롭 다운 컨트롤의 인덱스 값 (int)을가집니다. 모든 데이터를 저장하는 데 8 바이트 밖에 없습니다.7 바이트에서 8자를 압축
색인 값으로 8 바이트를 절약하기 위해 8 문자를 7 바이트로 압축 할 수 있습니까?
예, 으로 가정하면 문자는 표준 ASCII 문자 집합의 값만 사용합니다.
이 가정이 맞으면 0-127 (즉, 7 비트 값) 만 사용합니다. 따라서 정보는 8 * 7 비트 밖에 없습니다. 그리고 이것을 저장하는 데는 7 * 8 비트가 있습니다. 따라서 각 문자의 MSB를 제거하고 압축하십시오.
그는 8 바이트를 가지고 있으며 7 바이트 컨테이너에 넣기를 원합니다. 문구가 이상합니다 –
@ 0A0D : 그렇습니다. 이것이 ASCII 값의 문자를 사용하는 경우에만 작동하는 이유입니다. –
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;
}
여기 약간의 문제가 있습니다, UB. ''[]'는'char' 또는'int'를 반환하며'int'에서 1 비트를 뺀 숫자 이상을 이동시킬 수 없습니다. –
어떻게 문자열과 인덱스 값으로 다시 변환 할 수 있습니까? –
는 다음 네, 가능합니다. – Mysticial
정보를 잃지 않고. –
그들이 ASCII라고 가정하면, 그렇습니다. **하지만 ** ... – Potatoswatter