bitsetはそういうものがあるのは知っていましたが使ったことがなかったのですぐに書けるコードにしました。
bitsetにする利点は速度ですか?
バイナリ出力でもいいですが、文字列としてでもできるのか気になりました。
beatle さんが書きました:C言語ではchar型は8ビットとは限りませんが(言い換えると1バイトは8ビットとは限りませんが)、そのあたりの話は勉強されてますか?
それから、charのような有符号整数型に対するビット演算は処理系定義ですので、要確認です。
以上の細かい話を除けば、readとwriteの処理は間違っていないように見えます。
unsigned char型の配列で1フラグ1バイトで管理しても、そんなにメモリは食いませんし、頑張ってビットでやるよりも単純でいいかもしれません。たとえ100万個のフラグを配列で管理しても、使用メモリは1MBです。
unsigned charの配列なら、将来フラグが1,0ではなくて複数の値を取りたくなったときにも、楽に対応できますしね。
1バイト8ビットでないというのは知りませんでした。
普通のPCは8で特殊なコンピュータなどが4ですか?
Windowsのソフトとしてexeファイルにする以上8でいいと思うのですが良く無いですか?
ビット演算なら符号のありなしは関係ないと思ってました。unsigned char にすれば問題ないですよね。
unsigned charにフラグを入れればint型の4分の1で済みますね。しかし今回は拡張予定もなくファイル保存時に容量を減らすことが目的だったのでビットを選びました。ここまでフラグが多いのもめったにないと思うので以後フラグ管理のときunsigned charにしようかと思います。
バグ さんが書きました:ビットフィールドを使用するのもいいかもしれませんね。
下記のソースは、unsigned charのサイズが8ビットである環境なら動くと思います。
コード:
#include <stdio.h>
union BIT8
{
unsigned char BYTE;
struct
{
unsigned char B0 : 1;
unsigned char B1 : 1;
unsigned char B2 : 1;
unsigned char B3 : 1;
unsigned char B4 : 1;
unsigned char B5 : 1;
unsigned char B6 : 1;
unsigned char B7 : 1;
};
};
int main(void)
{
union BIT8 bit;
bit.BYTE = 0x00;
bit.B1 = 1;
bit.B3 = 1;
bit.B5 = 1;
bit.B7 = 1;
printf("%u\n", bit.BYTE);
printf("%u,%u,%u,%u,%u,%u,%u,%u\n", bit.B7, bit.B6, bit.B5, bit.B4, bit.B3, bit.B2, bit.B1, bit.B0);
return 0;
}
コードありがとうございます。
この方法も利点は速度ですか?
softya(ソフト屋) さんが書きました:とても多くのフラグといっても定義を見る限りは10万個程度のようです。
1バイトのフラグで管理しても100KBも必要ありませんので本当に必要なものかよく考えてみて下さい。
8ビットから16ビットパソコンの時代ならともかく現代でビットでフラグ管理が必要な状況が思い浮かびません。
ビット化はメモリ効率はアップしますが、L'zさんが気にしていたスピード効率の面では最悪です。
あとデバッグ効率も悪くなります。
例なので10万程度にしましたが最大でINT_MAXの値まで必要かもしれません。
最大までいかなくてもメガは確実に行くかと思います。
実行中はそれでもいいのですがそのデータを保存するときにメガ、場合によってはギガ?も使うならできるだけ減らしたいと思いビットの方法にしました。
1か0なので実行中はunsigned charで保存時は圧縮するというのも考えましたが圧縮は方法を知らなかったのですぐ書ける方法としてビットの方法にしました。