struct _ITEM_TYPE
{
struct
{
UINT m_Class : 7 ;//???这里什么意思?
UINT m_Quality: 7 ;
UINT m_Type: 7 ;
UINT m_Index: 11 ;
};
UINT ToUINT()
{
UINT uid = 0 ;
uid += m_Class;
uid= uid<<7;
uid += m_Quality;
uid= uid<<7;
uid += m_Type;
uid= uid<<11;
uid += m_Index;
return uid;
}
UINT ToSerial() const
{
UINT Serial;
Serial = m_Class;
Serial = Serial*100+m_Quality;
Serial = Serial*100+m_Type;
Serial = Serial*1000+m_Index;
return Serial;
}
BOOL isNull() const
{
return (m_Class==0)&&(m_Quality==0)&&(m_Type==0)&&(m_Index == 0);
}
BOOL operator==(_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);
}
BOOL operator>(_ITEM_TYPE& Ref) const
{
return ToSerial()>Ref.ToSerial();
}
BOOL operator<(_ITEM_TYPE& Ref) const
{
return ToSerial()<Ref.ToSerial();
}
VOID CleanUp()
{
m_Class = 0;
m_Quality = 0;
m_Type = 0;
m_Index = 0;
}
};
5 个解决方案
#2
了解了。仔细看下就了解意图了
#3
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 两种状态,用一位二进位即可。
大神勿喷~
#4
#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
#5
谢谢
#1
#2
了解了。仔细看下就了解意图了
#3
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 两种状态,用一位二进位即可。
大神勿喷~
#4
#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
#5
谢谢