zoukankan      html  css  js  c++  java
  • 联合体、位段巧妙用法

    初学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;  
  • 相关阅读:
    STM32驱动WS2811
    Arduino编程器 USBasp USBtinyISP FT232-ISP 对比 区别
    USBasp制作资料及全过程(菜鸟版)
    用74HC165读8个按键状态
    C++ 使用TinyXML解析XML文件
    SD卡中FAT32文件格式快速入门(图文详细介绍)
    一个UUID生成算法的C语言实现——WIN32版本
    关于STM8S使用硬件SPI收发问题
    设计模式介绍、分类、原则
    构建完整的知识体系
  • 原文地址:https://www.cnblogs.com/linsanshu/p/3859716.html
Copyright © 2011-2022 走看看