美文网首页
C/C++:联合体、位段巧妙用法

C/C++:联合体、位段巧妙用法

作者: 慧科集团华东校区 | 来源:发表于2017-08-14 13:09 被阅读0次

    作者:慧科集团华东校区-郭杰老师,转载请注明出处及本链接。


    初学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;

    相关文章

      网友评论

          本文标题:C/C++:联合体、位段巧妙用法

          本文链接:https://www.haomeiwen.com/subject/yyrrrxtx.html