初学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;
联合体、位段巧妙用法,布布扣,bubuko.com
联合体、位段巧妙用法
原文:http://www.cnblogs.com/linsanshu/p/3859716.html