联合体、位段巧妙用法

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

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

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

[cpp] view plaincopy
 
  1. typedef unsigned char uchar;  
  2. uchar *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. 位运算是个比较麻烦的事情,写代码很不直观。  

直到看到这样的代码~!

[cpp] view plaincopy
 
  1. typedef 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;  
  11. typedef union{  
  12.     uchar data_char;  
  13.     bits  data_bits;   
  14. }utype;  
  15.   
  16. uchar *addr = (uchar*)0x10;  
  17. utype value;  
  18. value.data_char = *addr;  
  19.   
  20. 如果要查看某个位比如第3位  
  21. 直接看 value.data_bits.bit3就可以了。  
  22.   
  23.   
  24. 如果要设置某个位,比如设置第0位为1,第7位为0  
  25. value.data_bits.bit0 = 1;  
  26. value.data_bits.bit7 = 0;  
  27. *addr = value.data_char;  
原文地址:https://www.cnblogs.com/linsanshu/p/3859716.html