我有以下数据压缩算法(对此问题进行了简化)。它包括位操作和输出元素位置(以及总输出大小),取决于先前的输入数据。
void compress_algrorithm(const uint8_t* src, size_t srcsz,
uint8_t* dst, size_t& dstsz, uint8_t* flags)
{
auto srcend = src + srcsz;
auto q = dst;
auto r = flags;
for (auto pp = src; pp < srcend; pp += 4*8) {
uint8_t f = 0;
for (int i = 0; i < 8; ++i) {
auto p = pp + i*4;
if (p[0] < 0x40 && p[1] < 0x40 && p[2] < 0x40 && p[3] < 0x40) {
// p[]s are all 6-bit value
f |= 1 << i;
// compress 6*4 bits (in 4 bytes) into 3 bytes
q[0] = p[0] | (p[1] << 6);
q[1] = (p[1] >> 2) | (p[2] << 4);
q[2] = (p[2] >> 4) | (p[3] << 2);
q += 3;
} else {
// if not, just copy
q[0] = p[0];
q[1] = p[1];
q[2] = p[2];
q[3] = p[3];
q += 4;
}
}
*r++ = f;
}
dstsz = q - dst;
}
是否可以在Halide中表达此算法?