• 联合体、位段巧妙用法


    初学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;  
  • 相关阅读:
    eclipse运行纯servlet程序
    VS中lib和dll
    eclipse部署web项目至本地的tomcat但在webapps中找不到
    【2018.07.28】(字符串/回文串)学习Manacher算法小记
    【2018.07.26】建立博客~
    【2018.07.27】(字符串/找相同)学习KMP算法小记
    [转]数据库范式那些事
    [转]Windows平台下的多线程编程
    mondrian schema学习(1)
    [转]SQL查询入门
  • 原文地址:https://www.cnblogs.com/linsanshu/p/3859716.html
Copyright © 2020-2023  润新知