使用位字段作为c

时间:2016-12-20 08:10:00

标签: c bit-manipulation

在我的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按递增顺序打印集合,那么我怎样才能为此重新排列位字段?

真的希望你有一些想法。

2 个答案:

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

您可以编写其他访问功能并完成作业。