1 按位运算符
1 按位逻辑运算符
按位取反 ~
按位与 &,赋值语句结合 &=
按位或 |,赋值语句结合 |=
按位异或 ^,赋值语句结合 ^=
2 设置位 flags |= MASK;
3 清除位 flags &= ~MASK;
4 翻转位 flags ^= MASK;
5 检查位的值 if ((flags & MASK) == MASK)
6 移位运算符
2 位字段(位域)
1 位域里面用 int 或 unsigned int来定义,但并不是 int 的大小(4字节),而是实际使用的空间大小。如下面只使用4位,则位域大小为1字节,即sizeof(prnt) = 1
2 填充位域的空洞
3 位域和联合体 union 一起使用 MQTT为例
下面是MQTT连接标志字节说明(每一位,都有特定含义)
如下所示为MQTT协议中的部分源码:
// 位域和联合体 union 一起使用
// 修改位域结构体标签,最后通过 char 来读出内容
typedef union
{
unsigned char all; /**< all connect flags */
struct
{
unsigned int : 1; /**< unused */
unsigned int cleansession : 1; /**< cleansession flag */
unsigned int will : 1; /**< will flag */
unsigned int willQoS : 2; /**< will QoS value */
unsigned int willRetain : 1; /**< will retain setting */
unsigned int password : 1; /**< 3.1 password */
unsigned int username : 1; /**< 3.1 user name */
} bits;
} MQTTConnectFlags; /**< connect flags byte */