标志位操作
在代码中,标志位很常见。它通过将一个额外的标志位附加到其他数据上,来表示一些状态信息。下面看看高位标志和低位标志两种方法的典型操作流程:
低位标志
/* 为数据添加低位标志 */
uint32_t data_flag = ((data << 1) | 0x01);
/* 获取低位标志 */
uint32_t flag = data_flag & 0x01;
/* 去掉低位还原数据 */
uint32_t data = data_flag >> 1;
- 对任何位数的数据都适用,可在不知道数据的位数的情况下进行操作。
- 对数据进行任何操作都需要先操作标志位。
- 易被错误修改。
高位标志
/* 为数据添加高位标志 */
uint32_t data_flag = (data | (0x01 << 31));
/* 获取高位标志 */
uint32_t flag = (data_flag >> 31) & 0x01;
/* 去掉高位还原数据 */
uint32_t data = data_flag & 0x7FFFFFFF;
- 标志位位于数据的高位,对数据操作时不需要先操作标志位。
- 高标志位不易被错误修改。
当操作的数据类型为带符号整数(如int类型)时,高位标志存在另一种使用方法:
/* 为数据添加高位标志 */
int data_flag = -data;
/* 获取高位标志 */
int flag = (data_flag < 0);
/* 去掉高位还原数据 */
int data = -data_flag;
- 可以直接通过给数据添加负号来表示高位标志,这样既可以直接取得高位标志值,也兼具低位标志的通用性,对任意位数整形数据都适用。
总结:
使用无符号整数
- 数据位数不确定时推荐使用低位标志。
- 数据位数确定时使用高标志位。
使用带符号整型
- 优先使用高标志位。