ビット操作&フラグ操作です♪
大量のフラグを管理する時、容量の大きさが気になる時が有る。
例えば、マップの全部ブロックに対する対するフラグの
設定となると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)
ただし、ちゃんと括弧や大括弧でくくってないと
予想外の展開をされたりするので注意。
そうなるとデバッグが大変…。<山のように喰らいました…。
例えば、メッセージを表示したしないのフラグなんかに
使うと丁度良いかも。
ボケは、それ用に作ったりしました。
| 固定リンク
コメント