位数组操作宏

实际开发的过程中才发现有时候某个模块的id就上百个,再写应用的时候就难免操作几个标志位。但是总不能建一堆uint8吧,本来内存也不大,(有些mcu里好像没有_BOOL,都是在头文件里typedef的uint8或者int)
然后网上看到有位数组操作宏这东西,也不用写一堆,没学好真是,现在才知道。

ed5e07fda98608881fe90ec94e98a77a
大概就是这样,

1.位数组定义()

#define maxnum 256
uint8_t array [((maxnum-1)>>3)+1];

点击查看代码
每个uint8_t可以存储8个位
计算所需字节数的公式:((maxnum-1)>>3)+1
maxnum-1 = 255
255 >> 3 = 31 (相当于除以8)
31 + 1 = 32
所以创建了一个32字节的数组,正好可以存储256位(32×8=256)

2.位操作宏

//测试
#define TSTBIT(datas, id_bit) ((datas[id_bit >> 0x03] & (0x01 << (id_bit & 0x07)))>0)

点击查看代码
id_bit >> 0x03:计算字节索引(相当于除以8)
id_bit & 0x07:计算位在字节中的偏移(相当于对8取模)
0x01 << (id_bit & 0x07):创建位掩码
使用按位与操作检查特定位是否为1
如果结果大于0,返回真(1),否则返回假(0)

//置1
#define SETBIT(datas, id_bit) (datas[id_bit >> 0x03] |= (0x01 << (id_bit & 0x07)))

//置0
#define CLRBIT(datas, id_bit) (datas[id_bit >> 0x03] &=(~ (0x01 << (id_bit & 0x07))))
置01就和检查差不多了

3.包装数组宏

#define TSTFLAG(id) TSTBIT(array, id)
#define CLRFLAG(id) CLRBIT(array, id)
#define SETFLAG(id) SETBIT(array, id)

哦对,因为宏定义是替换,所以不建议在里面添加类如 i++ 的参数,会i++两次
可以试试内联函数

点击查看代码
// 在头文件中声明为 static inline
static inline void SetFlag(uint16_t id_bit) {
    array[id_bit >> 0x03] |= (0x01 << (id_bit & 0x07));
}
大概这样...

posted on 2025-08-28 14:21  脑子疼  阅读(47)  评论(0)    收藏  举报

导航