• 締切済み

1ビットごとの配列を作りたい

例えばchar型で 5 0 4 という3つの数値があった時、 1 00000101  0  1 00000100 という配列にしたいのですが (5と4の前の1は「次は8ビット読む」という印。空白は見やすくするための物) ネットで調べてもよく分かりませんでした。 教えていただきたいのは、 ・ある構造体、配列などから上記のようなビット配列にする方法 ・ビット配列から通常の値にする方法 ・ビット配列のサイズ取得方法 です よろしくお願いします

みんなの回答

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.5

>確かにデルタ圧縮と書いてありましたが、ビット配列を自分で操作するのかと思いました。 最終的にビット配列を操作することになるかもしれませんがビット配列はビット配列で別に考えた方がよいです。 >型情報に関してはデータ配列の順番が分かっていればプログラムにその順で記述していけば問題ないかと思いました わかっているならですね。

Null0lluN
質問者

お礼

気合で自力で解決しました。 ありがとうございました

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.4

>ちなみに、 >考え方の参考にしたページ それビット配列のお話ではなく圧縮の話ですから、圧縮について勉強しましょう。 参考にされたページのは長さ1or8どちらか限定のランレングス圧縮ってとこでしょうか。 >また、例に挙げた数値がchar型ですから8bitですが、int型なら32bitになりますね。 ということは型情報も必要になりますね。 こっちはデータのシリアライズ化の話になるかと思います。 どちらも教えてといわれたからと簡単に教えられるようなものではないです(正直、基礎知識が足りてないと思う)。

Null0lluN
質問者

お礼

↑一部間違えました →1だから8ビット分読み込む・・・14←× →1だから32ビット分読み込む・・・14←○

Null0lluN
質問者

補足

確かにデルタ圧縮と書いてありましたが、ビット配列を自分で操作するのかと思いました。 型情報に関してはデータ配列の順番が分かっていればプログラムにその順で記述していけば問題ないかと思いました 例えば char int char floatという順でデータを入れることが分かっているなら 10000010110000000000000000000000000000111000 という配列を受け取ったら 1ビット読み込む →1だから8ビット分読み込み・・・5 1ビット読み込む →1だから8ビット分読み込む・・・14 1ビット読み込む →0だから値0 1ビット読み込む →0だから値0.0f みたいにすればよいのかと思いました 取りあえず、圧縮について勉強してきます

  • k_kota
  • ベストアンサー率19% (434/2186)
回答No.3

・ある構造体、配列などから上記のようなビット配列にする方法 メモリ確保して2進数で突っ込めばいいんじゃないでしょうか。 ・ビット配列から通常の値にする方法 まず、あなたのその表記の仕方は情報不足です。 常に8ビット読むわけではないですよね。常に8bitだったら印が無いほうが楽だと思います。 ・ビット配列のサイズ取得方法 逆に言うとサイズを決めて配列を準備します。 データのある範囲と言う事であれば、 1.先頭にデータサイズを保存する 2.末尾のパターンを決める とかにすればいいでしょう。 個人的にはあなたがやりたい事が明確になっていないか、 実現する方法が明確になっていない気がします。 それが決まらないのにやり方が決まるわけがありません。

Null0lluN
質問者

補足

>メモリ確保して2進数で突っ込めばいいんじゃないでしょうか。 これが分かりません >常に8ビット読むわけではないですよね 書いてある通り、0の時は1bitになりますね。 また、例に挙げた数値がchar型ですから8bitですが、int型なら32bitになりますね。 >実現する方法が明確になっていない気がします ちなみに、 考え方の参考にしたページ http://www.4gamer.net/games/105/G010549/20100905002/ ↑のサイトのこの画像 http://www.4gamer.net/games/105/G010549/20100905002/SS/025.jpg です

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

そういうクラスを作る…というところでしょうかね。 具体的なコードとかは出てきませんが。 保持している領域の節約を行いたいのでしょうが…… ・現在の環境ではその程度の節約はほとんど意味が無い。 ・変換にかかるコストが無駄。 などなど……。 手間掛けた分に見合う効果が期待できないので、コードまで出てきませんね。 4,0,5と入っていた配列が0,0,4とかに変更になったとき、ビットパターンは前詰めにするんですか? データ量が膨大だった時にかなりの操作を要求されますが、それがただのchar型配列だったとき(1個の変更で完了)よりも使いやすいものでしょうか? ファイルへの読み書き時に…という限定的な内容であればまだしも、通常使うデータ形式としてはいささか非効率的かと。 # しかも、データに0が含まれないと1ビットずつデータが増えることになりますが。 # 0,1,2,3,4,5,6,7,8の配列だと、1+9+9+9+9+9+9+9+9=73Bit。1Bit増えてます。

Null0lluN
質問者

補足

保持している領域というか、通信データ量を押さえたいのです。 考え方の参考にしたページ http://www.4gamer.net/games/105/G010549/20100905002/ ↑のサイトのこの画像 http://www.4gamer.net/games/105/G010549/20100905002/SS/025.jpg 毎回通信用バッファを構造体から毎回作成しているので前詰めとかは必要ありません。 また、構造体の一部分を除き、0である場合が多いのでビット数が増えることはまずありません。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.1

あなたが考えた独自のビット配列なら、その扱い方は、あなた自身で考えましょう。

Null0lluN
質問者

お礼

解決しました。 ありがとうございました

関連するQ&A

専門家に質問してみよう