/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//得到集合变量包含的元素输
//参数1:集合变量的指针
//注释:传递指针是想能够为任何集合类型计算.不必绑死到固定某个集合类型
//参数2:集合类型的大小
//注释:集合在内部是位运算.集合最多256个元素.因此集合是1-32个字节的类型,长度视集合类型的总元素个数而定.所以要给一个集合类型大小
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Function GetSetCount(AnySetPointer
ointer
const SizeofSet:Integer):Integer;
var
I ,j:Integer;
PB: PByte;
C: Byte;
begin
Result := 0;
PB := AnySetPointer;
for I := 0 to SizeofSet -1 do //对其本身及后的共SizeofSet个字节进行位运算
begin
C := $1;
for J := 0 to $F do //检测位是不是1,1表示包含次元素,0表示不包含
begin
if (C and PB^ = C) then
Inc(Result);
C := C shl 1;
if C = 0 then //移位出头了,就是0
break;
end;
Inc(PB);
end;
end;
用法如下:
type
TSS = set of char;
var
ss:tss;
I: Integer;
begin
SS := ['a'];
ss := SS + ['c'..'k'];
I := GetSetCount(@SS, SizeOf(TSS))
//获取集合变量元素总数
ShowMessage('ss包含元素数量是:'+IntToStr( I));
end;