- 締切済み
1ビットごとの配列を作りたい
例えばchar型で 5 0 4 という3つの数値があった時、 1 00000101 0 1 00000100 という配列にしたいのですが (5と4の前の1は「次は8ビット読む」という印。空白は見やすくするための物) ネットで調べてもよく分かりませんでした。 教えていただきたいのは、 ・ある構造体、配列などから上記のようなビット配列にする方法 ・ビット配列から通常の値にする方法 ・ビット配列のサイズ取得方法 です よろしくお願いします
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- wormhole
- ベストアンサー率28% (1626/5665)
>確かにデルタ圧縮と書いてありましたが、ビット配列を自分で操作するのかと思いました。 最終的にビット配列を操作することになるかもしれませんがビット配列はビット配列で別に考えた方がよいです。 >型情報に関してはデータ配列の順番が分かっていればプログラムにその順で記述していけば問題ないかと思いました わかっているならですね。
- wormhole
- ベストアンサー率28% (1626/5665)
>ちなみに、 >考え方の参考にしたページ それビット配列のお話ではなく圧縮の話ですから、圧縮について勉強しましょう。 参考にされたページのは長さ1or8どちらか限定のランレングス圧縮ってとこでしょうか。 >また、例に挙げた数値がchar型ですから8bitですが、int型なら32bitになりますね。 ということは型情報も必要になりますね。 こっちはデータのシリアライズ化の話になるかと思います。 どちらも教えてといわれたからと簡単に教えられるようなものではないです(正直、基礎知識が足りてないと思う)。
お礼
↑一部間違えました →1だから8ビット分読み込む・・・14←× →1だから32ビット分読み込む・・・14←○
補足
確かにデルタ圧縮と書いてありましたが、ビット配列を自分で操作するのかと思いました。 型情報に関してはデータ配列の順番が分かっていればプログラムにその順で記述していけば問題ないかと思いました 例えば 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)
・ある構造体、配列などから上記のようなビット配列にする方法 メモリ確保して2進数で突っ込めばいいんじゃないでしょうか。 ・ビット配列から通常の値にする方法 まず、あなたのその表記の仕方は情報不足です。 常に8ビット読むわけではないですよね。常に8bitだったら印が無いほうが楽だと思います。 ・ビット配列のサイズ取得方法 逆に言うとサイズを決めて配列を準備します。 データのある範囲と言う事であれば、 1.先頭にデータサイズを保存する 2.末尾のパターンを決める とかにすればいいでしょう。 個人的にはあなたがやりたい事が明確になっていないか、 実現する方法が明確になっていない気がします。 それが決まらないのにやり方が決まるわけがありません。
補足
>メモリ確保して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)
そういうクラスを作る…というところでしょうかね。 具体的なコードとかは出てきませんが。 保持している領域の節約を行いたいのでしょうが…… ・現在の環境ではその程度の節約はほとんど意味が無い。 ・変換にかかるコストが無駄。 などなど……。 手間掛けた分に見合う効果が期待できないので、コードまで出てきませんね。 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増えてます。
補足
保持している領域というか、通信データ量を押さえたいのです。 考え方の参考にしたページ http://www.4gamer.net/games/105/G010549/20100905002/ ↑のサイトのこの画像 http://www.4gamer.net/games/105/G010549/20100905002/SS/025.jpg 毎回通信用バッファを構造体から毎回作成しているので前詰めとかは必要ありません。 また、構造体の一部分を除き、0である場合が多いのでビット数が増えることはまずありません。
- wormhole
- ベストアンサー率28% (1626/5665)
あなたが考えた独自のビット配列なら、その扱い方は、あなた自身で考えましょう。
お礼
解決しました。 ありがとうございました
お礼
気合で自力で解決しました。 ありがとうございました