【STM32】定义多个开关变量,却又不想浪费内存?你可这样做!!!

C语言提供了一种数据结构,称为“位域”或“位段”。

位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。

为了节省存储空间,并使处理简便,所谓“位域”是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。

每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。

------------------------------------分割线---------------------------------------

下面将参照位域的概念,定义一个char变量,再用宏定义去声明这个char变量中的八个位的几种状态,代码如下:

unsigned char flag;
//-----------------------------------------------------------------------
//bit0
#define test_value0_f (flag&0x01)
#define set_value0_f (flag=flag|0x01)
#define clr_value0_f (flag=flag&(0xff^0x01))
#define not_value0_f (flag=flag^0x01)
//bit1
#define test_value1_f (flag&0x02)
#define set_value1_f (flag=flag|0x02)
#define clr_value1_f (flag=flag&(0xff^0x02))
#define not_value1_f (flag=flag^0x02)
//bit2
#define test_value2_f (flag&0x04)
#define set_value2_f (flag=flag|0x04)
#define clr_value2_f (flag=flag&(0xff^0x04))
#define not_value2_f (flag=flag^0x04)
//bit3
#define test_value3_f (flag&0x08)
#define set_value3_f (flag=flag|0x08)
#define clr_value3_f (flag=flag&(0xff^0x08))
#define not_value3_f (flag=flag^0x08)
//bit4
#define test_value4_f (flag&0x10)
#define set_value4_f (flag=flag|0x10)
#define clr_value4_f (flag=flag&(0xff^0x10))
#define not_value4_f (flag=flag^0x10)
//bit5
#define test_value5_b (flag&0x20)
#define set_value5_b (flag=flag|0x20)
#define clr_value5_b (flag=flag&(0xff^0x20))
#define not_value5_b (flag=flag^0x20)
//bit6
#define test_value6_f (flag&0x40)
#define set_value6_f (flag=flag|0x40)
#define clr_value6_f (flag=flag&(0xff^0x40))
#define not_value6_f (flag=flag^0x40)
//bit7
#define test_value7_f (flag&0x80)
#define set_value7_f (flag=flag|0x80)
#define clr_value7_f (flag=flag&(0xff^0x80))
#define not_value7_f (flag=flag^0x80)

其中,test_xxx是获取位的状态,set_xxx是将位置1,clr_xxx是将位清0,not_xxx是将位取反

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值