获取保存给定无符号整数所需的最小字节数

我需要将一系列无符号整数写入文件,每个整数不大于在运行时确定的限制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; } 

有没有更好的方法来达到同样的目的?

您可以尝试沿着这些方向(未经测试)。

 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; } 

但我不确定为什么这是个好主意。 为了读回值,您需要一种方法来标记表示下一个值的字节数。 我怀疑计数值会占用你保存的大部分字节。

有更好的压缩技术可用。

另一种方法是使用几个压缩库中的任何一个( zlib , bzip2等),它们可能会将您的数据编码为更少的字节,除非您的数据压缩不好(例如,纯粹的随机数据,转换为整数,可以执行更差)。