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

时间:2014-03-25 21:24:50

标签: c

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

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

2 个答案:

答案 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)

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