在嵌入式系统编程中,位运算比其他运算更常用。这正是由于在嵌入式系统中涉及到更多有关硬件寄存器的操作,硬件寄存器由若干位组成,这些位可能具有读写,只读,只写等几种属性。在C语言中,可以通过8位,16位,32位的指针进行相应的数据操作,因此整字节数据的读写还是比较直观的。然而,C语言中没有专门的对指定位操作的语法,在进行位操作的时候,需要对指令进行简单的组合来完成功能。
1)字节操作
1)字节操作
在嵌入式系统中,很多寄存器可能都是多字节的(如16位和32位),而实际上,我们可能需要在其中写入或读出单个字节,可以用下面的宏:
#define GETBYTE0(x) (x & 0x000000ff) //通过位与(&)操作使得最后8位保持不变,其余位为0
#define GETBYTE1(x) (x & 0x0000ff00)
#define GETBYTE2(x) (x & 0x00ff0000)
#define GETBYTE3(x) (x & 0xff000000)
同样,将一个32位数的指定字节全部置为1或者或者清0,用如下宏:
#define SETBYTE0(x) (x | 0x000000ff) //通过位或(|)操作使得最后8位为1,其余位保持不变
#define SETBYTE1(x) (x | 0x0000ff00)