在我的C课中,我们获得了一项任务:
编写交互式程序(标准输入/输出)。使用
set
定义新类型typedef
,它可以包含0-127范围内的一组整数。数据结构必须在存储方面尽可能高效(提示:使用位)。您还需要定义类型为set
的6个全局变量A,B,C,D,E,F。程序中所有集合上的操作都将基于这6个变量。此命令
read_set A,5,6,7,4,5,4,-1
将读取用户的整数输入,而-1
表示用户输入结束。用户可以使用的其他命令:print_set A
- 以递增顺序打印集合,union_set A,B,C
在2集上进行并集并将输出保存在第三集中,intersect_set A,B,C
- 确定2的交集设置并将输出保存到第三组。
据我了解,我需要使用位字段。我可以创建一个0-127的整数表。然后我可以使用A,B,C,D,E,F
类型定义创建6个变量set
,并为每个变量提供128个位字段。然后,如果用户输入15
,我将打开数据类型中代表15的位。我真的不确定这是不是这样的,因为我不清楚我如何安排位字段,以便我可以在第15位开启,如果我需要,我需要转换为某种整数位字段名称...同样print_set
按递增顺序打印集合,那么我怎样才能为此重新排列位字段?
真的希望你有一些想法。
答案 0 :(得分:1)
是的,每个名为A,B,C,D,E和F的集合由几个unsigned long long
整数表示,如下所示:
typedef struct {
unsigned long long high;
unsigned long long low;
} Set;
请参阅https://en.wikipedia.org/wiki/C_data_types
这为您提供了Set
中的128位数据(64位用于高数字64到127,64位用于低数字0到63)。
然后你只需要做一些这样的操作:http://www.tutorialspoint.com/ansi_c/c_bits_manipulation.htm
对于介于0和63之间的数字,您将1向左移动x次,然后在"低位"上设置该位。字段。
对于介于64和127之间的数字,您将1向左移动x-64次,然后在"高"上设置该位。字段。
希望这有帮助!
答案 1 :(得分:1)
由于对齐问题,使用位域进行此分配将非常麻烦,并且无论如何都无法定义位域数组。我建议使用一个字节数组(unsigned char
)并将值打包到此数组中。一个7位值,最多2个字节。
count
值的数组应分配大小为(count + 7) / 8
个字节。为了节省空间,您可以使用分配的数组将小集存储在整数和更大的集合中。
数据类型如下:
#include <stdint.h>
#include <stdlib.h>
typedef struct set {
size_t count;
union {
uintptr_t v;
unsigned char *a;
};
} set;
以下是如何提取第n个值:
int get_7bits(const set *s, size_t n) {
if (s == NULL || n >= s->count) {
return -1;
} else
if (n < sizeof(uintptr_t) * CHAR_BIT / 7) {
return (s->v >> (n * 7)) & 127;
} else {
size_t i = n / 7;
int shift = n % 7;
if (shift <= CHAR_BIT - 7) {
/* value fits in one byte */
return (s->a[i] >> shift) & 127;
} else {
/* value spans 2 bytes */
return ((s->a[i] | (s->a[i + 1] << CHAR_BIT)) >> shift) & 127;
}
}
}
您可以编写其他访问功能并完成作业。