вы говорите чего вы хотите от этого всего. или пишите на известном вам фреймворке. типизированный набор делайте через структуру, нетипизированный через объединения или приведения типов (можно на макросах) или ссылки. есть и либы, но сперва надо знать что вы сделать хотите. желательно подробно.
Битовые маски? Стандартных средств в Си нет (вроде). Объединить - | , пересечь - &. Проверка на принадлежность i-того элемента - через сдвиг единицы (либо хранить сдвинутые значения в массивчике, если скорость критичнее) + &. Нужно правда будет все элементы универсума занумеровать.
Vilco а это разве не стандартные средства? + к вашему ~ -- not ^ -- xor всякие маски и константы задаются, обычно enum { ... MASK_n = N, MASK_m = M, ... }; итд (а я то думал)
qqwe Человек, насколько я понял, искал готовые решения. Если элементов достаточно много (или вообще переменное число), то enum заведомо не годится. Но можно один раз посчитать все 1 << i и сложить их в массив, хотя смысла не очень много, ведь чтобы извлечь это значение потом из массива требуется примерно столько же времени сколько и для того, чтобы сдвинуть.
Что-то я не понял, при чём здесь битовые маски? Множества обычно ведь на основе красно чёрных деревьев реализуются.
Если заранее известны всевозможные члены множества и их количество не превышает битовый размер нативного целого (например, 32), то используют битовые поля. А даже если и превышает, но все равно достаточно мало, скажем, несколько сотен - то все равно часто проще завести класс, содержащий фиксированный массив таких интов, перегрузить для него битвайз операции и наслаждаться без всяких деревьев скоростью функционирования.
ТОгда относительно оптимальным вариантом может оказаться хэш-таблица строк. Или еще лучше - хэш таблица указателей на связные списки строк.