C语言中利用共用体、结构体、位域实现位操作

更新时间:2024-03-21 22:36:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

编写过51(MCU)程序的同学都知道51架构的MCU支持位操作,这是一个很方便的特性,在读取/修改寄存器某位的值时非常方便快捷。但其他架构的MCU大多都不支持该特性,即不支持位操作,所在在对寄存器中某一位进行操作的时候都是and/or两个操作共同使用,在编写程序时非常麻烦。在查找了大量资料后,笔者得出了本文中提到的一种折中方法。 名词解释:

共用体(union)表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。在union中,所有的共用体成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。

结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。 位域是指信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。

在程序中定义这样一个共用体(union):

[cpp]view plaincopy print?

1. typedef union 2. {

3. WORD flags; 4. struct 5. {

6. unsigned int flag_bit0:1; 7. unsigned int flag_bit1:1; 8. unsigned int flag_bit2:1; 9. unsigned int flag_bit3:1; 10. unsigned int flag_bit4:1; 11. unsigned int flag_bit5:1; 12. unsigned int flag_bit6:1; 13. unsigned int flag_bit7:1; 14. unsigned int flag_bit8:1; 15. unsigned int flag_bit9:1; 16. unsigned int flag_bit10:1; 17. unsigned int flag_bit11:1; 18. unsigned int flag_bit12:1; 19. unsigned int flag_bit13:1;

20. unsigned int flag_bit14:1; 21. unsigned int flag_bit15:1; 22. }bit; 23. }Flag;

上面的共用体给出了一个16位寄存器的定义,在操作中,既可以对整个寄存器一起操作,也可以针对某一位进行操作。

例如,在程序中定义一个共用体的对象: Flag stFlag; stFlag.flags = 0xa5;

int P0_0 = stFlag.bit.flag_bit0; int P0_1 = stFlag.bit.flag_bit1;

// 实际中位域的排序根据编译器以及具体系统的存储模式相关

本文来源:https://www.bwwdw.com/article/r6b8.html

Top