我需要将一系列无符号整数写入文件,每个整数不超过运行时确定的限制n
。为了节省空间,我想用尽可能少的字节打包它们。但是,我不知道如何计算保存它们所需的最小字节数,因此我只有以下丑陋的解决方案:
int get_needed_bytes(uint32_t n) {
if (n < 256) return 1;
else if (n < 65536) return 2;
else if (n < 16777216) return 3;
return 4;
}
有没有更好的方法来达到同样的目的?
答案 0 :(得分:2)
您可以尝试沿着这些方向(未经测试)。
int GetNeededBytes(uint32_t n)
{
// Maximum number of bytes supported
int bytes = 4;
// Get mask for highest order byte
// Warning: watch for overflow here
// 4 bytes should resolve to 0xff000000
int mask = 0xff << (bytes * 8);
while (bytes > 0)
{
if (n & mask)
return bytes;
mask /= 0x100;
bytes--;
}
return 0;
}
但我不确定为什么这是一个好主意。为了读回值,您需要一种方法来标记表示下一个值的字节数。我怀疑计数值会占用你保存的大部分字节。
有更好的压缩技术。
答案 1 :(得分:2)