我有以下设置操作:
=(INDIRECT("A" & ROW()) = "Project Completion")*(INDIRECT("F" & ROW())=H$7)
所有这些都是正常的设定操作。我有以下假设需要您确认:
操作:如果=($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。
操作:编译器会将myset
的前两位设置为1
,其余位设置为myset
。
操作:编译器会将第三位设置为1
。
操作:编译器会将前三位设置为0
,其余位设置为0
。
我对Delphi集类型的内部工作感兴趣。
我希望您确认这是否正确,如果错了,该如何处理?
答案 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那样拥有如此酷的内置集类型。