联合体、位段巧妙用法

初学C语言union的时候,一直在想到底在哪里用到它,甚至在工作的前一年基本上认为union是无用的,直到后来看到一大牛写的代码,才豁然开朗,深感学无止境!

直接上代码,见如下应用场景:

在硬件编程中,经常要进行位操作,假定 寄存器是8位的(这里就偷个懒,不写32位的了),且某个寄存器的地址是 0x10,现在我要读写寄存器。

1typedef unsigned char uchar;2uchar *addr = (uchar*)0x10;3 4这里如果我要查看寄存器某个位的值的时候5  (1)uchar value  = *addr;6  (2)然后对value进行位运算看某个位的值。7 8如果我想给寄存器某个位写值,则 9按照如下步骤10 (1)value = *addr;11 (2)  通过位运算修改value的值12 (3)*addr = value; 再把value写回寄存器13 14位运算是个比较麻烦的事情,写代码很不直观。15 16 

直到看到这样的代码~!

1typedef struct{2	uchar bit0:1;3	uchar bit1:1;4	uchar bit2:1;5	uchar bit3:1;6	uchar bit4:1;7	uchar bit5:1;8	uchar bit6:1;9	uchar bit7:1;10}bits;11typedef union{12	uchar data_char;13	bits  data_bits; 14}utype;15 16uchar *addr = (uchar*)0x10;17utype value;18value.data_char = *addr;19 20如果要查看某个位比如第3位21直接看 value.data_bits.bit3就可以了。22 23 24如果要设置某个位,比如设置第0位为1,第7位为025value.data_bits.bit0 = 1;26value.data_bits.bit7 = 0;27*addr = value.data_char;

© 版权声明
THE END
在时间中留下我的脚印
分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情图片