首先,这不是功课。在一个压缩算法中,我试图让我需要以这种方式存储东西:
我想存储0到2 ^ 10-1之间的数字。
通常会消耗16位来存储这个数字。我不想要这个。另一个理智的人会说:很好,使用前10位。我不想要这个。
我想存储这样的数字:使用5位,3位为空,使用5位,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);
}