我从一个100,000字节的数组开始,其中每个字节中只有低6位有有用的数据。我需要尽快将这些数据打包成75,000字节的数组,保留数据的顺序。
unsigned int Joinbits(unsigned int in) {}
答案 0 :(得分:4)
// 00111111 00111111 00111111 00111111
// 000000 001111 111122 222222
void pack6(
register unsigned char o,
register unsigned char const *i,
unsigned char const *end
)
{
while(i!=end)
{
*o++ = *i << 2u | *(i+1) >> 4u; ++i;
*o++ = (*i & 0xfu) << 4u | *(i+1) >> 2u; ++i;
*o++ = (*i & 0xfcu) << 6u | *(i+1) ; i+=2;
}
}
如果输入长度不能被4整除,则会失败。假设高2位输入为零。 完全便携。读取4个输入字节6次,因此读取效率低50%,但处理器缓存和编译器优化器可能有所帮助。尝试使用变量来保存读取可能会适得其反,只有实际测量才能证明。
答案 1 :(得分:0)
for(int pos=0; pos<100000; pos+=4)
{
*(int*)out = (in[0] & 0x3F) | ((in[1] & 0x3F)<<6) | ((in[2] & 0x3F)<<12) | ((in[3] & 0x3F)<<18);
in += 4;
out += 3;
}
答案 2 :(得分:0)
这是C,我不懂C ++。并且可能充满了错误,并且绝不是最快的方式,它可能甚至不快。但是我想要去试试,因为学习一些东西似乎是一个有趣的挑战,所以请用我做错的事来打击我! :d
unsigned char unpacked[100000];
unsigned int packed[75000 / 4];
for (int i = 0; i < (100000 / 6); i += 6) {
unsigned int fourBytes = unpacked[i];
fourBytes += unpacked[i + 1] << 6;
fourBytes += unpacked[i + 2] << 12;
fourBytes += unpacked[i + 3] << 18;
fourBytes += unpacked[i + 4] << 24;
fourBytes += unpacked[i + 5] << 30;
unsigned short twoBytes = unpacked[i + 5] >> 2;
twoBytes += unpacked[i + 6] << 4
twoBytes += unpacked[i + 7] << 10;
packed[i] = fourBytes;
packed[i + 4] = twoBytes;
}