尽可能快地将数据打包到数组中

时间:2010-12-12 23:52:43

标签: c++

我从一个100,000字节的数组开始,其中每个字节中只有低6位有有用的数据。我需要尽快将这些数据打包成75,000字节的数组,保留数据的顺序。

unsigned int Joinbits(unsigned int in) {}

3 个答案:

答案 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;
}
相关问题