What is it, naokirin?

メモリ制約のある時の複数のブールフラグの格納

最近、ブログの更新が随分と滞っていました。
理由は単に私が体調を崩してました・・・。咽頭痛と体のだるさが抜けずに2日間を過ごして、ほとんど勉強などはしていなくて更新する内容そのものがありませんでした。
今日は随分と良くなったので、普段の生活に戻れそうです。

近況はこの辺にして本題へ。

最近ではコンピュータでメモリ不足を気にしてプログラミングするようなことは少ないとは思うのですが、組み込みなどの分野を考えるとまだないわけではないのかもしれません。(そういう分野に疎いので実際にどうなのかは知りませんが。)
今回はそういうときの話なので、プログラミングの環境として4GBのメモリを搭載したのWindows7を使っている私には縁遠い話に近いのですが、いろんなことを勉強しておくのは良いことだと思っているので今回は書きます。

題名に書いているように複数のブールフラグを出来る限り少ないメモリで確保したいとします。
その場合に整数型の変数を使ってみます。
整数型の各ビットを一つ一つのフラグの値と考えて操作します。

例えば、4ビットのブールフラグを使うとします。そこでC言語のshort型の下位4ビットを使うとします。
すると、次のようなコードを書くことができます。

#define VAR_FLAG_ONE 1
#define VAR_FLAG_TWO 2
#define VAR_FLAG_THREE 4
#define VAR_FLAG_FOUR 8

/* ブールフラグに使う整数型変数 */
short v = 0;


ここで定数を用いることで様々な操作を行うことができます。


真に設定したい場合、OR演算を行います。

/* 1ビット目を真に設定 */
v |= VAR_FLAG_ONE


クリアしたい場合、補数とのAND演算を行います。

/* 3ビット目をクリア */
v &= ~VAR_FLAG_THREE


調べたいビットのフラグが真かどうかをテストするためには、AND演算を行います。

/* 4ビット目をテスト */
if(v & VAR_FLAG_FOUR){ … }


ソフトウェア開発手法の本などを読みかじった身としてはお勧めできるプログラミングの手法とは言えませんが、メモリ不足が深刻な場合には有効だと思います。
もちろん、今回のように32ビット処理系で通常16ビットあるshort型を4ビットだけ使うなんて無駄遣いをするくらいなら、他にも良い手がある気はします。

今回はここまで。