アイテムの範囲が十分に小さい場合は、列挙の手段としてビットマップを使用できます。たとえば、1〜32の範囲の整数のセットを表す場合、必要なのはビットマップとして使用される32ビット整数だけです。
00000001 00000001 00000000 00000000 - for set {8,16}
^ ^
8 16
等
範囲が大きい場合は、バイトの配列を使用します。各ビットは、この位置の値がセットに存在するかどうかを表します。
#define MAXVAL 1024
typedef unsigned char bitmap_t[];
byte bitmap[1 + MAXVAL / CHAR_BIT] = { 0 };
// CHAR_BIT is defined in limit.h and is equal to count of bits in a byte
void insert(bitmap_t bitmap, unsigned val) {
assert(val < MAXVAL);
bitmap[val / CHAR_BIT] |= (1 << (val % CHAR_BIT);
}
int is_present(bitmap_t bitmap, unsigned val) {
assert(val < MAXVAL);
return bitmap[ val / CHAR_BIT ] & (1 << (val % CHAR_BIT));
}