联合体、位段巧妙用法

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

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

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

typedef unsigned char uchar;
uchar *addr = (uchar*)0x10;

这里如果我要查看寄存器某个位的值的时候
  (1)uchar value  = *addr;
  (2)然后对value进行位运算看某个位的值。

如果我想给寄存器某个位写值,则 
按照如下步骤
 (1)value = *addr;
 (2)  通过位运算修改value的值
 (3)*addr = value; 再把value写回寄存器

位运算是个比较麻烦的事情,写代码很不直观。


直到看到这样的代码~!

typedef struct{
	uchar bit0:1;
	uchar bit1:1;
	uchar bit2:1;
	uchar bit3:1;
	uchar bit4:1;
	uchar bit5:1;
	uchar bit6:1;
	uchar bit7:1;
}bits;
typedef union{
	uchar data_char;
	bits  data_bits; 
}utype;

uchar *addr = (uchar*)0x10;
utype value;
value.data_char = *addr;

如果要查看某个位比如第3位
直接看 value.data_bits.bit3就可以了。


如果要设置某个位,比如设置第0位为1,第7位为0
value.data_bits.bit0 = 1;
value.data_bits.bit7 = 0;
*addr = value.data_char;














  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值