2

ファイルから読み取っている整数が大量にあります。それらはすべて0または1になるので、読み取った各整数をブール値に変換しました。

私がする必要があるのは、8ビット/ブールごとに1つの文字にパックすることによって、文字が提供するスペース(8ビット)を利用することです。これどうやってするの?

二項演算を試しましたが、思いついたものがありません。

int count = 7;
unsigned char compressedValue = 0x00;
while(/*Not end of file*/)
{
    ...

    compressedValue |= booleanValue << count;

    count--;
    if (count == 0)
    {
        count = 7;
        //write char to stream
            compressedValue &= 0;
    }
}

アップデート

これまでに提案されたいくつかの修正を反映するようにコードを更新しました。次の質問は、unsigned charを初期化/クリアするにはどうすればよいですか?

アップデート

文字ビットをクリアするための変更を反映しました。

皆さん、助けてくれてありがとう。

4

3 に答える 3

3

いくつかの注意:

  • while(!in.eof())間違っている場合は、最初に何かを読み取るためにtry(!)を実行する必要があり、それが成功した場合は、データを使用できます。
  • unsigned charを使用して、少なくとも8ビットの整数を取得します。または、stdint.hを調べて、uint8_t(またはuint_least8_t)を使用します。
  • シフト操作が間違った方向にありますuint8_t(1) << count。代わりに使用してください。
  • メモリ内でそのようなことをしたい場合は、32ビットや64ビットなどのより大きなタイプを使用します。これは、一度に1バイトをはるかに超える数を読み取ることができたとしても、1バイトの読み取りは単一のRAMアクセスであるためです。
  • バイトを書き込んだ後、一時をゼロにすることを忘れないでください。
于 2013-01-24T20:09:51.983 に答える
1

Mooing Duckが提案したように、ビットセットを使用できます。

ソースコードは概念実証にすぎません。特にファイル読み取りを実装する必要があります。

#include <bitset>
#include <cstdint>
#include <iostream>

int main() {

   char const fcontent[56] { "\0\001\0\001\0\001\0\001\0\001"
     "\001\001\001\001\001\001\001\001\001\001\001\001"
     "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
     "\0\001\0\001\0\001\0\001" };

   for( int i { 0 }; i < 56; i += 8 ) {
      std::bitset<8> const bs(fcontent+i, 8, '\0', '\001');
      std::cout << bs.to_ulong() << " ";
   }
   std::cout << std::endl;

   return 0;
}

出力:

85 127 252 0 0 1 84 
于 2013-01-24T21:22:48.770 に答える
-2

vector<bool>あなたが望むように詰め込まれている標準的な保証。車輪の再発明をしないでください。詳細はこちら

于 2013-01-24T20:12:22.563 に答える