打印

如何创建一个BIT类型的数组?

[复制链接]
3354|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
28182900|  楼主 | 2013-1-5 10:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
AV693| | 2013-1-5 11:29 | 只看该作者
bit不是标准c语言支持的类型

使用特权

评论回复
板凳
28182900|  楼主 | 2013-1-5 11:43 | 只看该作者
不标准不要紧

使用特权

评论回复
地板
airwill| | 2013-1-5 13:44 | 只看该作者
不标准不要紧, Keil C51 支持 bit 变量, 单不支持 bit 数组, 并不是编译器解决不了这个问题, 而是因为 51 单片机不支持 bit 位变量的间接寻址. 没有合适的指令来操作  bit 数组.

使用特权

评论回复
5
28182900|  楼主 | 2013-1-5 14:33 | 只看该作者
IAR下的各种芯片支持吗,现在主要是用stm32,可以搞不?

使用特权

评论回复
6
28182900|  楼主 | 2013-1-6 11:07 | 只看该作者

使用特权

评论回复
7
28182900|  楼主 | 2013-1-9 10:19 | 只看该作者
人工置顶。求大神!

使用特权

评论回复
8
xuyaqi| | 2013-1-9 13:25 | 只看该作者
28182900:你建BIT类型的数组的目的是什么?

使用特权

评论回复
9
28182900|  楼主 | 2013-1-9 14:19 | 只看该作者
省空间,存一个码表

使用特权

评论回复
10
28182900|  楼主 | 2013-1-10 09:15 | 只看该作者
[tr][/tr]
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;
}

这两位大神提供了2维bit类型的数组,无奈我实在是看不懂

使用特权

评论回复
11
28182900|  楼主 | 2013-1-12 16:59 | 只看该作者

使用特权

评论回复
12
28182900|  楼主 | 2013-1-14 09:15 | 只看该作者
人工置顶~

使用特权

评论回复
13
yibanhuiyi| | 2013-1-14 09:30 | 只看该作者
            同顶~~~~~~~~~~~~~~

使用特权

评论回复
14
28182900|  楼主 | 2013-1-21 15:51 | 只看该作者
我顶~

使用特权

评论回复
15
28182900|  楼主 | 2013-1-22 15:38 | 只看该作者

使用特权

评论回复
16
28182900|  楼主 | 2013-1-23 09:14 | 只看该作者

使用特权

评论回复
17
28182900|  楼主 | 2013-1-28 13:47 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:工作永远干不完,生命却一直在倒计时

100

主题

1127

帖子

2

粉丝