Цикл действительно формально правильный способ сделать это.
type
TSetType = set of TEnumType;
function HighestMember(const s: TSetType): TEnumType;
begin
for Result := High(Result) downto Low(Result) do
if Result in s then
exit;
raise Exception.Create('empty sets have no highest member');
end;
Любое решение другого типа потребует приведения типов или ассемблера, которые вынуждают вас потерять безопасность типов - они, так сказать, выходят за пределы языка.
Если вы можете гарантировать, что ваш набор содержит не более 32 возможных элементов, то этот набор может быть перекрыт обычным целым числом, и ваш вопрос эквивалентен запросу позиции старшего набора битов в 32-разрядном целом числе. , Это было задано здесь раньше, в значительной степени:
Если у вас нет 32-элементного ограничения на тип набора, значит, у вас есть ограничение Delphi в 256 элементов, и любое решение с битовым переворотом должно обрабатывать 32- байт .