c - 用 C 中的位表示一组整数
问题描述
我的任务是创建一个 typedef 来表示从 0 到 127 的数字数组。
数字不能重复——它是一组整数。
这不好,因为它消耗了太多数据:
typedef struct set {
char array[128];
} some_set;
至于稍后,这个数据结构将用于定义不同的集合(set_a
、set_b
、set_c
等),这些集合将用于不同的操作,例如:
print_set
这将打印集合union_set
将 2 组组合成第 3 组intersect_set
这将与 2 组相交并将数据保存在第 3 组中
有人建议用一点来表示每个数字,但我真的无法理解它。
解决方案
您不能仅使用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;
}
推荐阅读
- django - 在不复制模型/字段定义的情况下重命名 ModelSerializer 字段的 DRY 方法?
- javascript - javascript对象上的for循环
- c# - 使用 ASP .Net core 3.1 Web 服务运行 docker 容器时出现运行时错误
- ios - 使用私有队列 NSManagedObjectContext,我是否需要访问私有队列上 NSManagedObjects 的属性?
- javascript - p5.js 说:由于当前范围内未定义“createVector”而出现错误
- docker - 使用 helm 重启 Pihole 部署
- hive - 蜂巢中条件的顺序是否重要?
- html - 使用可变路径从 Web 元素获取内部文本 - Selenium
- enums - 在宏中匹配类似元组的枚举变体,其中枚举类型和变体是元变量:我如何编写匹配模式?
- java - Java——子类和超类的关系