如何使用无符号整数来表示集合?

时间:2012-02-15 23:04:13

标签: c

我被赋予了创建执行基本集合操作的程序的任务。说明如下:

  

您应该将集合表示为无符号整数,每个位   无符号数字表示集合中的一个可能元素。从而,   我们有32个可能的设置元素(0,1,... 31)和32位位置   unsigned int变量(也是0,1,... 31)。出于此目的   程序无论你是否“命名”最低位   unsigned int为0(最高位为31)或者如果你   “命名”最高位0位和最低位31.在任何一种情况下我们都会   在位位置i中定义'1'表示元素i是其成员   由unsigned int表示的集合。

我的第一个想法是使用数组来存储数据,但是我的教授告诉我不要那样做,只使用无符号的整数。我的问题是如何实现这个?我的印象是,如果我在打印出来时将unsigned int设置为00000000000000000,那么在输出时我仍然会得到0。如果没有400万个测试用例,我该如何检查该组的每个成员?

他举例说要重复一组{19,3,31,12,7}我会有

10000000000010000001000010001000

他提供的声明我将被要求建立我的定义:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

extern unsigned int setUnion(unsigned int set1, unsigned int set2);
extern unsigned int setIntersection(unsigned int set1, unsigned int set2);
extern void clearSet(unsigned int *set);
extern void add2Set(unsigned int *set, int value);
extern void deleteFromSet(unsigned int *set, int value);
extern int isMember(unsigned int set, int element);
extern void printSet(unsigned int);

对于如何做到这一点的任何想法将不胜感激。我并不期待你能为我做我的功课,只是想找到一些关于如何开始的帮助。

4 个答案:

答案 0 :(得分:2)

使用C位运算符(&|^<<>>~)来访问各个位您unsigned int个对象的价值。

答案 1 :(得分:1)

您想查看bitwise operations。集合中的每个值都可以由无符号整数(32位)值中的单个位指示,其中位集(意味着等于1)表示包含。

在c中,按位运算符为& | ^ ~ << >>

答案 2 :(得分:0)

Bitwise Operation - 他要求你在无符号(32位)int中设置特定位。

unsigned int foo = 1 << 31;

这只是设置unsigned int中的“第一”位:

1000000000000000

答案 3 :(得分:0)

如果您的号码为n,则其掩码为1<<n,例如,检查set s是否包含n:s&(1<<n)

对于联合和交集,您可以直接使用|&运算符。

用它来解决其余问题。