簡易のビットエンコーダ

圧縮のプログラムを書くときにはbit単位でエンコーディングをする必要があるため、bit単位でエンコードをするBitEncoderというものを書いてみた。
動作としては1byte変数にbitをバッファリングしていっぱいになったらファイルに書き出すという感じです。

#include <cstdio>
#include <iostream>
struct BitEncoder{
  FILE *fp;
  unsigned char bval , bindex;
  bool buffered;
  BitEncoder(const char * fileName){
    fp = fopen(fileName , "wb");
    buffered = false;
    bindex = 7;
    bval = 0;
  }
  ~BitEncoder(){
    if(buffered){
      flush();
    }
    fclose(fp);
  }
  void encode(bool b){
    if(bindex){
      if(b){
        bval |= 1 << bindex;
      }
      --bindex;
      buffered = true;
    }else{
      if(b){
        bval |= 1;
      }
      flush();
    }
  }
  void flush(){
    fwrite(&bval , 1 , 1 , fp);
    buffered = false;
    bval = 0;
    bindex = 7;
  }
};


void encode(BitEncoder & enc , unsigned char val){
  for(int i = 7 ; i >= 0 ; i--){
    if(val & (1 <<i)){
      enc.encode(true);
    }else{
      enc.encode(false);
    }
  }
}
int main(){
  {
    BitEncoder enc("out");
    enc.encode(true);
    enc.encode(false);
    enc.encode(true);
    enc.encode(true);
  }
  /*
   * od -tx1 out
   * 0000000 b0
   * 0000001 
   *
   * /
}