1

この関数は、一部の入力に対して正しく機能しません。では、何が間違っているのでしょうか?

すべてのプロジェクト コードはこちら:リンク

ps:「bits.size()%8」がゼロに等しい入力を使用しています

QByteArray bitsToBytes(QBitArray bits) {
  QByteArray bytes;
  bytes.resize(bits.count()/8);

  // Convert from QBitArray to QByteArray
  for(int b=0; b<bits.count(); ++b)
    bytes[b/8] = ( bytes.at(b/8) | ((bits[b]?1:0)<<(b%8)));

  return bytes;
}
4

3 に答える 3

1

Topro アルゴリズムは全体として正しいはずです。しかし、私のコンサートはテスト付きbits[b]?1:0です。

デフォルトでは、operator[] ( int i )「変更可能な参照としてインデックス位置 i のビット」をoperator[] ( int i ) const返し、ブール値を返します。最初の定義が選択されている場合、参照が真かどうかをテストします。

でToproアルゴリズムを試してくださいbits.testBit(b)

于 2012-01-05T12:55:03.437 に答える
1

おそらくビットは左シフトされた(7 - (b % 8))ビット になると思います

これを試してみたところ、期待どおりの結果が得られました。

QBitArray bits;
QByteArray bytes;

bits.resize(12);
bits.fill(true);

bits.setBit(2,false);

bytes.resize((bits.count() - 1) / 8 + 1);

for(int b=0; b<bits.count(); ++b)
    bytes[b/8] = ( bytes.at(b/8) | ((bits[b]?1:0)<<(7-(b%8))));

for (int b=0;b<bytes.size();b++)
    printf("%d\n",(quint8)bytes.at(b));
于 2012-01-05T10:28:42.587 に答える
0

(bits.count() % 8) != 0 の場合を考えてみましょう。たとえば 9 ではbytes.resize(bits.count()/8);、間違った結果が返されます。

Topro がコメントで提案したように、 を使用できますbytes.resize((bits.count() - 1) / 8 + 1))

于 2012-01-05T10:50:13.527 に答える