网站首页 全球最实用的IT互联网站!

人工智能P2P分享Wind搜索发布信息网站地图标签大全

当前位置:诺佳网 > 软件工程 > 操作系统 > 嵌入式 >

位数组操作宏

时间:2025-08-28 14:21

人气:

作者:admin

标签:

导读:实际开发的过程中才发现有时候某个模块的id就上百个,再写应用的时候就难免操作几个标志位。但是总不能建一堆uint8吧,本来内存也不大,(有些mcu里好像没有_BOOL,都是在头文件里...

实际开发的过程中才发现有时候某个模块的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));
}
大概这样...
温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信