2

int i の最下位ビットを char 型のバッファー buff に書き込み、ビット バッファー インデックスをインクリメントする writeBit メソッドがあります。私が持っているものが正しいかどうかはわかりませんが、どんな意見でも大歓迎です。

private:
char buff;    // buffer
int num_bits; // num of bits written to buff
std::ostream& os_ref;

public:
// Skipping the constructor and ostream& for brevity

int writeBit(int i) {
  // flush buffer if full
  if(num_bits == 8)
  flush();

  // write least significant bit into the buffer at the current index.
  int lb = i & 1;
  buff = buff & num_bits;  // not sure about this line
  buff = lb;
  num_bits++;

  // return current index
  return num_bits; // do I return nbits as current index?
}
4

3 に答える 3

0

私はこのようなものがうまくいくはずだと思います、私に知らせてください:

buff |= (i & 1) << nbits;

基本的に、最後の重要なビットを取得し、左側のビットをnbits回移動し、このビットがbuffに追加される間は、必ずbuff0 に設定してください。flush()
i & 1<< nbits

于 2013-08-23T06:50:24.947 に答える
0

フラッシュが num_bits をゼロに設定すると仮定します。

char unmask = ~(1 << num_bits);
buf &= unmask;
buf |= (i & 1) << num_bits;
++num_bits;

num_bits のビットが常にゼロの場合、@Michael の答えの方が優れています。

于 2013-08-23T06:53:00.583 に答える
0

uint32_t の最下位ビットを取得するには:

uint32_t i = 1337;
uint8_t lsb = i & 1; // zeroes out all bits except first
buffer |= (lsb << num_bits); // shifts the lsb by num_bits to left and then ORs it into the char field

注:互換性の理由からuint32_t代わりに使用しました。unsigned int

于 2013-08-23T06:53:14.163 に答える