位参数
位参数是为了节省内存、减少函数参数或其他原因,而实现的在一个数据类型中存放多个参数的方法。
位操作
接下来就要介绍如何操作位参数。
写入位
C语言并没有提供直接操作位的方法,那我们要怎么写入到位中,甚至是精确到第几位呢?
方法一
直接按照位所在位置来写入对应的数值数据。
char BitPara = 0x80;
如果有多个参数那么就可以使用 或
运算来添加新参数。
char BitPara = 0x80 | 0x08;
记住参数在哪一位显然让人难以接受,那么我们可以把每个参数对应的位数值写成宏,这样就不用记忆参数位置了。
#define Para1 0x80
#define Para2 0x08
char BitPara = Para1 | Para2 ;
方法二
利用C语言
位域
来进行位操作。
我们可以定义一个位域结构。
struct
{
unsigned char Bit0 : 1;
unsigned char Bit1 : 1;
unsigned char Bit2 : 1;
unsigned char Bit3 : 1;
unsigned char Bit4 : 1;
unsigned char Bit5 : 1;
unsigned char Bit6 : 1;
unsigned char Bit7 : 1;
}BitPara;
这样一来,我们操作位就十分的方便,还可以直接命名位参数。
BitPara.Bit0 = 1;
BitPara.Bit1 = 0;
还可以结合内联体,让我们既可以单独操作位,也可以直接写入位值。
union ByteBitParaUn
{
unsigned char Byte;
struct
{
unsigned char Bit0 : 1;
unsigned char Bit1 : 1;
unsigned char Bit2 : 1;
unsigned char Bit3 : 1;
unsigned char Bit4 : 1;
unsigned char Bit5 : 1;
unsigned char Bit6 : 1;
unsigned char Bit7 : 1;
}Bit;
}BBPara;
BBPara.Bit.Bit0 = 1;
BBPara.Byte |= 0x80;
读取位
现在我们已经将位参数初始化完成了,那么我们该如何知道某个位参数是什么状态呢?
方法一
使用位域结构直接进行读取。
char Para = BBPara.Bit.Bit0;
方法二
采取
与
运算并且结合三元
运算来判断位的状态。
char BitPara = 0x80;
char Para = (BitPara & 0x80) ? 1 : 0;
当然也可以直接在判断、循环中直接使用。
if (BitPara & 0x80)
{
/*参数启用*/
}
while (BitPara & 0x80)
{
/*参数启用*/
}