首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请问如下UINTm_Class : 7是什么意思? 该结构作用是什么

2013-12-15 
请教如下UINTm_Class : 7是什么意思? 该结构作用是什么?struct _ITEM_TYPE{struct{UINTm_Class : 7 //???

请教如下UINTm_Class : 7是什么意思? 该结构作用是什么?


struct _ITEM_TYPE
{

struct  
{
UINTm_Class : 7 ;//???这里什么意思?
UINTm_Quality: 7 ;
UINTm_Type: 7 ;
UINTm_Index: 11 ;
};

UINTToUINT()
{
UINTuid = 0 ;

uid+= m_Class;
uid= uid<<7;
uid+= m_Quality;
uid= uid<<7;
uid+= m_Type;
uid= uid<<11;
uid += m_Index;

return uid;

}

UINTToSerial()const
{
UINT Serial;
Serial = m_Class;
Serial= Serial*100+m_Quality;
Serial= Serial*100+m_Type;
Serial= Serial*1000+m_Index;
return Serial;
}



BOOLisNull() const
{
return (m_Class==0)&&(m_Quality==0)&&(m_Type==0)&&(m_Index == 0);
}

BOOLoperator==(_ITEM_TYPE& Ref) const
{
return (m_Class==Ref.m_Class)&&(m_Quality==Ref.m_Quality)&&(m_Type==Ref.m_Type)&&(m_Index==Ref.m_Index);
}

BOOLoperator>(_ITEM_TYPE& Ref) const
{
return ToSerial()>Ref.ToSerial();
}

BOOLoperator<(_ITEM_TYPE& Ref) const
{
return ToSerial()<Ref.ToSerial();
}
VOIDCleanUp()
{
m_Class=0;
m_Quality=0;
m_Type=0;
m_Index=0;
}


};

[解决办法]
位域
[解决办法]

struct  
    {
            UINT    m_Class : 7 ;//???这里什么意思?    
            UINT    m_Quality: 7 ;    
            UINT    m_Type: 7 ;    
            UINT    m_Index: 11 ;
    };

结构体中4个UINT总共4 * 1 * 8 = 32bit。
4个成员不是每个成员占8bit
m_Class, m_Quality和m_Type需要7bit就够了,m_Index需要11bit。
有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态,用一位二进位即可。

大神勿喷~


[解决办法]
#include <stdio.h>
#pragma pack(push,1)
union U {
    unsigned char byte;
    struct BF {
        unsigned int b0:1;//a
        unsigned int b1:1;//b
        unsigned int b2:1;//c
    } bf;
} u;
#pragma pack(pop)
unsigned char bt;
int a,b,c;
int main() {
    for (bt=0;bt<8;bt++) {
        u.byte=(unsigned char)bt;
        a=u.bf.b0;
        b=u.bf.b1;
        c=u.bf.b2;
        printf("byte 0x%02x -- c:%d b:%d a:%d\n",bt,c,b,a);
    }
    for (c=0;c<2;c++)
    for (b=0;b<2;b++)
    for (a=0;a<2;a++) {
        u.bf.b0=a;
        u.bf.b1=b;
        u.bf.b2=c;
        bt=u.byte;
        printf("c:%d b:%d a:%d -- byte 0x%02x\n",c,b,a,bt);
    }
    return 0;
}
//byte 0x00 -- c:0 b:0 a:0
//byte 0x01 -- c:0 b:0 a:1
//byte 0x02 -- c:0 b:1 a:0
//byte 0x03 -- c:0 b:1 a:1
//byte 0x04 -- c:1 b:0 a:0
//byte 0x05 -- c:1 b:0 a:1
//byte 0x06 -- c:1 b:1 a:0
//byte 0x07 -- c:1 b:1 a:1
//c:0 b:0 a:0 -- byte 0x00


//c:0 b:0 a:1 -- byte 0x01
//c:0 b:1 a:0 -- byte 0x02
//c:0 b:1 a:1 -- byte 0x03
//c:1 b:0 a:0 -- byte 0x04
//c:1 b:0 a:1 -- byte 0x05
//c:1 b:1 a:0 -- byte 0x06
//c:1 b:1 a:1 -- byte 0x07

热点排行