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是将位取反