Вы не можете сделать это только с typedef
.
Учитывая, что для реализации этого будет достаточно любого типа, который содержит не менее 128 бит.Примеры:
typedef uint32_t intset[4]; // array
typedef struct {uint64_t data[2];} intset; // struct containing an array
typedef uint128_t intset; // built-in 128-bit integer type
В дополнение к typedef
необходимо определить функции, которые работают со структурой данных.Например:
void intset_init(intset *set);
void intset_add(intset *set, int n);
void intset_remove(intset *set, int n);
bool intset_check(intset *set, int n);
bool intset_is_empty(intset *set);
Каждая такая функция должна использовать bit-fiddling для своей работы.Например:
typedef uint32_t intset[4];
void intset_add(intset *set, int n)
{
(*set)[n / 32] |= (uint32_t)1 << (n % 32);
}
Может быть более эффективно передавать и возвращать структуру данных по значению, а не по указателю.Если вы хотите этого, вы не можете использовать массив typedef
- используйте любой другой, который удобен.
typedef struct {uint64_t data[2];} intset;
intset intset_add(intset set, int n)
{
set.data[n / 64] |= (uint64_t)1 << (n % 64);
return set;
}