generic function Card<T>(const ASet: T): Integer;
var
  Bytes: array [0..31] of byte;absolute ASet;
  i: Integer;
begin
  if GetTypeKind(T) <> tkSet then
     Exit(-1);
  if (SizeOf(ASet) > 32) then
     Exit(-1);
  Result := 0;
  for i := 0 to SizeOf(T) - 1 do
    Result := Result + PopCnt(Bytes[i]);
end;
begin
  n:=Card(X);
end.