首页 > 解决方案 > 用 C 中的位表示一组整数

问题描述

我的任务是创建一个 typedef 来表示从 0 到 127 的数字数组。

数字不能重复——它是一组整数。

这不好,因为它消耗了太多数据:

typedef struct set {
    char array[128];
} some_set;

至于稍后,这个数据结构将用于定义不同的集合(set_aset_bset_c等),这些集合将用于不同的操作,例如:

有人建议用一点来表示每个数字,但我真的无法理解它。

标签: cdata-structuressetbitwise-operators

解决方案


您不能仅使用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);

每个这样的函数都应该使用比特摆弄来完成它的工作。例如:

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;
}

推荐阅读