用C表示一组带有位的整数

时间:2018-05-16 16:17:53

标签: c data-structures typedef bitwise-operators

我需要帮助。我的任务是创建一个typedef,它代表一个从0到127的数字数组。 数字不能重复 - 它是一组整数。

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

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

以后这个数据结构将用于定义不同的集合(set_a,set_b,set_c等等),这些集合将用于不同的操作,如:

      print_set which will print the set  

      union_set which combines 2 sets into 3rd set

      intersect_set which will intersect 2 sets and save the data in the 3rd

这是用法的例子。

有人建议稍微代表每个数字,但我无法真正地围绕它。

1 个答案:

答案 0 :(得分:2)

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