在部分字节中存储int的最快方法?

时间:2014-01-17 18:32:19

标签: c++

首先,这不是功课。在一个压缩算法中,我试图让我需要以这种方式存储东西:

我想存储0到2 ^ 10-1之间的数字。

通常会消耗16位来存储这个数字。我不想要这个。另一个理智的人会说:很好,使用前10位。我不想要这个。

我想存储这样的数字:使用5位,3位为空,使用5位,3位为空。

如何快速完成这项工作而不会产生令人讨厌的错误风险?

3 个答案:

答案 0 :(得分:2)

我认为除了显而易见的方式之外,尝试其他任何事情都没有多大意义:

static inline void store10(uint8_t *out, unsigned short value)
{
  out[0] &= 0xe0;
  out[0] |= (value & 0x1f0) >> 5; // mask not needed if value is in-range.
  out[1] &= 0xe0;
  out[1] |= value & 0x1f;
}

答案 1 :(得分:1)

int x = ...;
unsigned char first = x & 0x1f;
unsigned char second = x >> 5;

答案 2 :(得分:0)

unsigned short pack10(unsigned short n)
{
    return ((n & 0x3e0)<<6) | ((n & 0x1f)<<3);
}