编译器如何转换集合操作?

时间:2017-05-09 19:48:46

标签: delphi set

我有以下设置操作:

=(INDIRECT("A" & ROW()) = "Project Completion")*(INDIRECT("F" & ROW())=H$7)

所有这些都是正常的设定操作。我有以下假设需要您确认:

  1. 操作:如果=($A$8 = "Project Completion")*($F$8 = H$7) 的第一位等于program SetOperations; type TMySet = (v1,v2,v3,v4,v5,v6); var myset: TMySet; begin // Some initialization // Operation 1 if v1 in myset then ; // Operation 2 myset := [v1] + [v2]; // Operation 3 myset := myset - [v3]; // Operation 4 myset := [v1,v2,v3]; end. ,编译器将返回true。

  2. 操作:编译器会将myset的前两位设置为1,其余位设置为myset

  3. 操作:编译器会将第三位设置为1

  4. 操作:编译器会将前三位设置为0,其余位设置为0

  5. 我对Delphi集类型的内部工作感兴趣。

    我希望您确认这是否正确,如果错了,该如何处理?

1 个答案:

答案 0 :(得分:2)

使用位平面存储集合,例如每个包括序数一位。
一组只能包含256个不同的值。每个值为1位,这意味着一个集合最多可占用32个字节 Delphi将尝试使用最小的空间用于集合,并且出于性能原因,限制集合的大小以使其适合CPU寄存器是明智的。

确保将大型集合作为const参数传递,以免复制大量数据。

集合上的操作使用布尔逻辑实现。 在下表中,s是一个集合,m是序数,可能在集合中,也可能不在集合中。 b是一个布尔值。

s:= [m,n]        s:= (1 shl m) or (1 shl n) assignment
s:= s + m        s:= s or (1 shl m)         add 
s:= s - m        s:= s and not(1 shl m)     subtract
s:= s * [m]      s:= s and (1 shl m)        intersection
b:= m in s       b:= (s and (1 shl m)) <> 0 inclusion
b:= s1 >= s2     b:= s1 = (s1 or s2)        subset
b:= s1 <= s2     b:= s2 = (s1 or s2)        subset
b:= s1 <> s2     b:= (s1 xor s2) <> 0

正如您所看到的那样,使用集合(特别是适合CPU寄存器的小集合)的操作非常快速和简单。 令人遗憾的是,没有更多的语言像Pascal那样拥有如此酷的内置集类型。