通过摆脱所有其他位来有效地缩小数据

时间:2017-12-04 22:33:57

标签: c++ binary

我的源数据是冗余的,每个位都是重复的。我正在重新安排和处理这些数据,并且有几个数据。我主要在python工作,但由于处理速度的限制,我已经转而使用C ++,尽管我不熟悉所有的细微差别。 如果这是我的原始数据:1100 0011 1100 1100我希望它看起来像这样:1001 1010我的解决方案是比较每个位置并逐位组合新数据。有没有更有效的方法呢?

显然,这里困惑的人是另一种解释问题的尝试。

收到数据:1100 1100 0011 0011

所需数据:1x0x 1x0x 0x1x 0x1x

正确:1010 0101

传入数据的每一位代表两次。有两个1和两个0,其中应该只有一个1和一个0.而不是检查位的状态然后将其转换为新的字节什么是更有效的解决方案?

1 个答案:

答案 0 :(得分:1)

根据@ user4581301的想法,您可以使用映射表将每个可能的16位输入映射到相应的8位"收缩"目标。但请注意,此(稀疏)映射表需要65536个条目,因为这是16位输入的范围。当然,这种方法只有在必须转换大量16位输入值时才有意义(这样准备映射表的时间不计算在内):

uint8_t map2uint8[65536];

void prepareMappingTable() {
    for (uint16_t i=0; i<=255; i++) {
        // dublicate the bits:
        uint16_t position = 0;
        uint16_t targetBit = 1;
        for(uint16_t sourceBit = 1; sourceBit<=128; sourceBit <<= 1) {
            if(i&sourceBit) {
                position |= targetBit;
                position |= (targetBit << 1);
            }
            targetBit <<= 2;
        }
        map2uint8[position] = i;
    }
}

int main(){

    prepareMappingTable();

    uint16_t input = 0b1100001111001100;
    uint8_t output =  map2uint8[input];

    cout <<  bitset<8>(output) <<  endl;
    return 0;
}