原创 21*21二维数组如何定义比较好(都是bit型,定义成char型太浪费空间了)

2008-8-20 09:44 2658 6 6 分类: 软件与OS

原帖地址:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=1382777&bbs_page_no=1&bbs_id=9999


第一种方法:


        typedef struct 
        {
                unsigned long int a:1;
                unsigned long int b:1;
                        .
                        .
                      依次类推        
                        .
                unsigned long int u:1;
                unsigned long int :11;
        }A;
        
        A data[21];
         引用时data[3].e就是你所说的a[3][5]


第二种方法:


贴上代码,如果_id值是常数的话,由于编译器的优化,一般可以产生比较好的代码,当然如果是变量的话,也是支持的
#define BIT_SET(_buf,_id) \
{ ((char *)(_buf))[(_id)/(sizeof(char)<<3)] |= 1<<(_id)%(sizeof(char)<<3); }

#define BIT_CLR(_buf,_id) \
{ ((char *)(_buf))[(_id)/(sizeof(char)<<3)] &= ~(1<<(_id)%(sizeof(char)<<3)); }

#define BIT_GET(_buf,_id) \
(((char *)(_buf))[(_id)/(sizeof(char)<<3)] >> ((_id)%(sizeof(char)<<3))        & 0x01)

#define BIT_ROW_MAX   21
#define BIT_SET2(_buf,_max,_x,_y) BIT_SET((_buf),((_x)*(_max)+(_y)))
#define BIT_CLR2(_buf,_max,_x,_y) BIT_CLR((_buf),((_x)*(_max)+(_y)))
#define BIT_GET2(_buf,_max,_x,_y) BIT_GET((_buf),((_x)*(_max)+(_y)))

int main(int argc, char* argv[])
{
        char buf[256]={0};
        int s=5;;
        BIT_SET(buf,25);
        s = BIT_GET(buf,25);
        printf("25=%d\n",s);
        BIT_CLR(buf,25);
        s = BIT_GET(buf,25);
        printf("25=%d\n",s);

        BIT_SET2(buf,21,3,2);
        BIT_CLR2(buf,21,2,3);
        s = BIT_GET2(buf,21,3,2);
        printf("2,3=%d\n",s);
        BIT_CLR2(buf,21,2,3);
        s = BIT_GET2(buf,21,2,3);
        printf("2,3=%d\n",s);
        printf("Hello World!\n");
        return 0;
}


第一种方法已经很节省空间了,可是第二种方法还可以进一步节省空间。例如,21×21,第一种方法是84字节,第二种方法是56字节,节约28个字节。很可观呀。

方法      字节占用
2维数组   n×n 
第一种     4n 
第二种    (n×n + 7)/8,取整

而且第二种方法可以任意扩展数组的大小。


对于第二种方法:


在一个应用中,应该这么用
#define BUFSIZ 4
uchar buf[BUFSIZ]={0};
#define SET(_id) BIT_SET(buf,_id)
#define CLR(_id) BIT_CLR(buf,_id)
#define GET(_id) BIT_GET(buf,_id)

#define LIGHT0   (1<<0)
#define LIGHT1   (1<<1)
...
#define LIGHTn   (1<<n) /* n < BUGSIZ*8*/

函数中调用
  uchar lightState;
  SET(LIGHT0);
  CLR(LIGHT3);
  lightState = GET(LIGHT9);

在51中可以这样优化
  uchar data buf[BUFSIZ]={0};
  { ((char data * data)(_buf))[(_id)/(sizeof(char)<<3)] |= 1<<(_id)%(sizeof(char)<<3); } 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条