位字段(Bit Field)讨论

位字段以结构体形式声明,结构体为每个字段声明标签,并定义宽度。如下

struct BitFileds

{

    unsigned int a  :2;

    unsigned int b  :4;

unsigned int    :2;

    unsigned int c  :8;

};

 

a,b,c分别占据2,4,8位宽度,中间还有一个匿名字段,占2个位。按常规结构体定义该结构占据4个int大小,实际上它只占1个int大小。

 

下面是查看位字段内存布局的实例。(位字段是与硬件相关的,不同系统可能得到不同的结果,如本例中a在低位,而其他系统中a可能在高位。)

 

#include "stdio.h"

 

typedef struct

{

    unsigned short a  :2;

    unsigned short b  :4;

    unsigned short c  :8;

    unsigned short    :0;   // 0占位项,可以显式将d放入下一个unsigned short中

    unsigned short d  :3;

    unsigned short e  :13;

} BitFileds;

 

typedef union

{

    BitFileds bf;

    int ui;

} un_BitField;

 

 

void itobs(int n, char* bs); 

void showresult(const char* str);

 

void main()

{

    BitFileds bf;

    un_BitField un_bf;

 

    bf.a = 1;

    bf.b = 1;

    bf.c = 1;

    bf.d = 5;

    bf.e = 0;

 

    un_bf.bf = bf;

 

    char bs[8*sizeof(int) + 1];

 

    itobs((int)un_bf.ui, bs);

 

    showresult(bs);

}

 

//将整形数转化为二进制字符串

void itobs(int n, char* bs)

{

    int len = 8 * sizeof(int);

 

    for (int k = len - 1;k >= 0;k--,n>>=1)

    {

        bs[k] = (0x01&n) + '0';

    }

    bs[len] = '\0';

}

 

//显示二进制字符串

void showresult(const char* str)

{

    int i = 0;

    while (str[i])

    {

        putchar(str[i]);

        if (++i%4 == 0 && str[i])

        {

            putchar(' ');

        }

    }

    putchar('\n');

}

 

结果:

 

posted on 2010-07-06 01:55  xufzu123  阅读(634)  评论(0编辑  收藏  举报