« ペンタブレットの具合が悪いです…。 | トップページ | 『エンカペラG』って知っているかい? »

2006年6月27日 (火)

ビット操作&フラグ操作です♪

大量のフラグを管理する時、容量の大きさが気になる時が有る。

例えば、マップの全部ブロックに対する対するフラグの
設定となると1600x1200
ブロックとかなるとかなりデカイです。
1920000個のフラグを管理する時どのぐらいの
容量が必要になるか…。

INTなら  7680000バイト、
CHARなら1920000バイト、
ビットなら  240000バイトになる。

基本的にデータ量は、少ないに越した事は無い。
そのために、圧縮処理などと工夫をすることになるのだが…。
ビットにする事は、劣化無しで圧縮できるのでお得だ。

#include<stdio.h>
#include<memory.h>
void bit_set(char*buffer,int index)
{
    buffer[index>>3]|=1<<(index&7);
}
void bit_reset(char*buffer,int index)
{
    buffer[index>>3]&=-1^(1<<(index&7));
}
char bit_check(char*buffer,int index)
{
    return (buffer[index>>3]>>(index&7))&1;
}
#define SIZE (3*8)
void bit_display(char*buffer)
{
    int i;
    for(i=0;i<SIZE;i++)
        printf("%d",bit_check(buffer,i));
    printf("\n");
}
void main(void)
{
    char buffer[SIZE/8];
    int i;
    memset(buffer,0,sizeof(buffer));
    for(i=0;i<SIZE;i++)
    {
        bit_set(buffer,i);
        bit_display(buffer);
    }
    for(i=0;i<SIZE;i++)
    {
        bit_reset(buffer,i);
        bit_display(buffer);
    }
    for(i=SIZE-1;i>=0;i--)
    {
        bit_set(buffer,i);
        bit_display(buffer);
    }
    for(i=SIZE-1;i>=0;i--)
    {
        bit_reset(buffer,i);
        bit_display(buffer);
    }
}

実際そんなに大きくない処理なので
マクロにすると扱い易いかも…?
例えばこんな感じ。

#define bit_set(b,i) {b[i>>3]|=1<<(i&7);}
#define bit_reset(b,i) {b[i>>3]&=-1^(1<<(i&7));}
#define bit_check(b,i) ((b[i>>3]>>(i&7))&1)

ただし、ちゃんと括弧や大括弧でくくってないと
予想外の展開をされたりするので注意。
そうなるとデバッグが大変…。<山のように喰らいました…。

例えば、メッセージを表示したしないのフラグなんかに
使うと丁度良いかも。

ボケは、それ用に作ったりしました。

|

« ペンタブレットの具合が悪いです…。 | トップページ | 『エンカペラG』って知っているかい? »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: ビット操作&フラグ操作です♪:

« ペンタブレットの具合が悪いです…。 | トップページ | 『エンカペラG』って知っているかい? »