集合转化为整形的问题(100分)

  • 主题发起人 主题发起人 seawolf2000
  • 开始时间 开始时间
S

seawolf2000

Unregistered / Unconfirmed
GUEST, unregistred user!
TGetRecordOption = (grMetaData, grReset, grXML, grXMLUTF8);
TGetRecordOptions = set of TGetRecordOption;
[grReset, grXML, grXMLUTF8] 转化为整形是多少
[grMetaData, grXML, grXMLUTF8] 转化为整形是多少


谢谢!!
 
1、可以说,把集合转化为整数毫无意义。集合的本质不是什么狗屁整数,而是一系列按位存储的 0、1 序列,每一位对应声明时的每个元素,1 表示集合中有此元素,0 则表示元素不在集合中。其大小也是由当初声明时元素的多少而定的,最大可达 32 字节(256位),那时候您就别玩什么“转化为整形”这类花花肠子了,好么?
2、[grReset, grXML, grXMLUTF8] = 14, [grMetaData, grXML, grXMLUTF8] = 13,之所以这样,仅仅因为 grMetaData(1), grReset(2), grXML(4), grXMLUTF8(8) 分别对应着序列的第 0、1、2、3 位,您说这样的转化有用么?如果您认为有用,可以用下面的方法:
var
gros: TGetRecordOptions;
i: Integer;
begin
gros := [grReset, grXML, grXMLUTF8];
i := PByte(@GetRecordOptions)^;
end;
 
集合的运算是位运算,集合中每个元素占集合的一个位.
但集合未必就是整数.
看集合最多元素的多少.集合的长度是不固定的.
例如:
TA = set of (a,b);这样的集合只占1个字节.
TA = Set of char;这样的集合占32个字节.
也就是集合每大8个元素就占1个字节.
所以集合不能完全用整数来表示.
如果集合占1个字节可以用Byte表示.
占2个字节可以用WORD表示
占3,4个字节可以用Cardinal表示.
占5-8个字节可以用UIN64表示.
再大就没法变成正数表示了.

Type
TSet = set of (Set0,Set1,Set2,Set3,Set4,Set5,Set6,Set7,
Set8,Set9,SetA,SetB,SetC,SetD,SetE,SetF);
var
ASet : TSet;
Int : WORD;
begin
ASet := [Set0];
Int := WORD(ASet);
Caption := IntToHex(Int, 4);
end;
 
多人接受答案了。
 
后退
顶部