1# 位操作 2 3 4## 基本概念 5 6位操作是指对二进制数的bit位进行操作。程序可以设置某一变量为状态字,状态字中的每一bit位(标志位)可以具有自定义的含义。 7 8 9## 功能说明 10 11系统提供标志位的置1和清0操作,可以改变标志位的内容,同时还提供获取状态字中标志位为1的最高位和最低位的功能。用户也可以对系统的寄存器进行位操作。位操作模块为用户提供下面几种功能,接口详细信息可以查看API参考。 12 13 **表1** 位操作模块接口 14 15| **功能分类** | **接口描述** | 16| -------- | -------- | 17| 置1/清0标志位 | - LOS_BitmapSet:对状态字的某一标志位进行置1操作<br/>- LOS_BitmapClr:对状态字的某一标志位进行清0操作 | 18| 获取标志位为1的bit位 | - LOS_HighBitGet:获取状态字中为1的最高位<br/>- LOS_LowBitGet:获取状态字中为1的最低位 | 19| 连续bit位操作 | - LOS_BitmapSetNBits:对状态字的连续标志位进行置1操作<br/>- LOS_BitmapClrNBits:对状态字的连续标志位进行清0操作<br/>- LOS_BitmapFfz:获取从最低有效位开始的第一个0的bit位 | 20 21 22## 编程实例 23 24 25### 实例描述 26 27对数据实现位操作,本实例实现如下功能: 28 291. 某一标志位置1。 30 312. 获取标志位为1的最高bit位。 32 333. 某一标志位清0。 34 354. 获取标志位为1的最低bit位。 36 37### 编程示例 38 39本演示代码在./kernel/liteos_a/testsuites/kernel/src/osTest.c中编译验证,在TestTaskEntry中调用验证入口函数BitSample。 40 41``` 42#include "los_bitmap.h" 43#include "los_printf.h" 44 45static UINT32 BitSample(VOID) 46{ 47 UINT32 flag = 0x10101010; 48 UINT16 pos; 49 50 PRINTK("\nBitmap Sample!\n"); 51 PRINTK("The flag is 0x%8x\n", flag); 52 53 pos = 8; 54 LOS_BitmapSet(&flag, pos); 55 PRINTK("LOS_BitmapSet:\t pos : %d, the flag is 0x%0+8x\n", pos, flag); 56 57 pos = LOS_HighBitGet(flag); 58 PRINTK("LOS_HighBitGet:\t The highest one bit is %d, the flag is 0x%0+8x\n", pos, flag); 59 60 LOS_BitmapClr(&flag, pos); 61 PRINTK("LOS_BitmapClr:\t pos : %d, the flag is 0x%0+8x\n", pos, flag); 62 63 pos = LOS_LowBitGet(flag); 64 PRINTK("LOS_LowBitGet:\t The lowest one bit is %d, the flag is 0x%0+8x\n\n", pos, flag); 65 66 return LOS_OK; 67} 68``` 69 70 71### 结果验证 72 73编译运行得到的结果为: 74 75 76``` 77Bitmap Sample! 78The flag is 0x10101010 79LOS_BitmapSet: pos : 8, the flag is 0x10101110 80LOS_HighBitGet:The highest one bit is 28, the flag is 0x10101110 81LOS_BitmapClr: pos : 28, the flag is 0x00101110 82LOS_LowBitGet: The lowest one bit is 4, the flag is 0x00101110 83``` 84