我被赋予了创建执行基本集合操作的程序的任务。说明如下:
您应该将集合表示为无符号整数,每个位 无符号数字表示集合中的一个可能元素。从而, 我们有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);
对于如何做到这一点的任何想法将不胜感激。我并不期待你能为我做我的功课,只是想找到一些关于如何开始的帮助。
答案 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)
。
对于联合和交集,您可以直接使用|
和&
运算符。
用它来解决其余问题。