fastest way to write a bitstream on modern x86 hardware

后端 未结 4 1315
忘了有多久
忘了有多久 2020-12-14 22:59

What is the fastest way to write a bitstream on x86/x86-64? (codeword <= 32bit)

by writing a bitstream I refer to the process of concatenating variable bit-length

4条回答
  •  不知归路
    2020-12-14 23:09

    I wrote once a quite fast implementation, but it has several limitations: It works on 32 bit x86 when you write and read the bitstream. I don't check for buffer limits here, I was allocating larger buffer and checked it from time to time from the calling code.

    unsigned char* membuff; 
    unsigned bit_pos; // current BIT position in the buffer, so it's max size is 512Mb
    
    // input bit buffer: we'll decode the byte address so that it's even, and the DWORD from that address will surely have at least 17 free bits
    inline unsigned int get_bits(unsigned int bit_cnt){ // bit_cnt MUST be in range 0..17
        unsigned int byte_offset = bit_pos >> 3;
        byte_offset &= ~1;  // rounding down by 2.
        unsigned int bits = *(unsigned int*)(membuff + byte_offset);
        bits >>= bit_pos & 0xF;
        bit_pos += bit_cnt;
        return bits & BIT_MASKS[bit_cnt];
    };
    
    // output buffer, the whole destination should be memset'ed to 0
    inline unsigned int put_bits(unsigned int val, unsigned int bit_cnt){
        unsigned int byte_offset = bit_pos >> 3;
        byte_offset &= ~1;
        *(unsigned int*)(membuff + byte_offset) |= val << (bit_pos & 0xf);
        bit_pos += bit_cnt;
    };
    

提交回复
热议问题